Thread 中讨论的其他器件:SysConfig、 UNIFLASH
最近,我不得不经历一个艰难的过程,搜索和尝试做一个不同大小的程序,然后添加串行跟踪和最后能够加密它。
本教程的想法是让任何希望执行相同操作的人都能执行必要的步骤、从而使加密正常工作、感谢 Arthur R.和 Lucas Holzen 提供的帮助。
我知道有些步骤需要更多的解释、但考虑到这是一个相当复杂的主题、我认为这是理所当然的、任何愿意这样做的人都具备足够的知识来解决这个细节问题(例如:如何将 tinyScript 库连接到 MCUBoot)。
- 向程序添加跟踪:按照 Arthur 在本线程中提供的步骤操作(警告程序不适合示例引导加载程序):
来自 Arthur 的报价:
"要进行日志记录、您需要禁用 exclude_trace 符号、例如、在项目设置中将"x"附加到该符号中:"
之后、您需要从 CCS 中复制 iTM_private、trace.c 和 trace.h 文件。 sdk_path\source\third_party\mcuboot\ti\source\mcuboot_app\mcuboot_config 至 mcuboot_config 文件夹 mcuboot_app 默认项目。
最后、将电源驱动程序添加到 SysConfig
然后、如果使用 CC1312R7、则将调试输出更改为
1 - 在 trace.c 中将 ITM_3000000更改为 ITM_115200、以将波特速度更改为115200 (在本例中、此程序的速度与主程序相同)。
2 - IOCPortConfigureSet (IOID_13、IOC_PORT_MCU_SWV、IOC_STD_OUTPUT)更改为 IOCPortConfigureSet (IOID_3、IOC_PORT_MCU_SWV、IOC_STD_OUTPUT); 到正常串行端口中的串行布线。
恭喜您、已启用串行跟踪、但现在程序无法装入插槽中、让我们进行更改。
2.更改时隙大小:示例中的默认时隙不要为用户保存数据留出空间、例如使用 NVS 和引导加载程序空间对我来说有点小、因此我也必须更改它。
- 确定存储器组织:第一个插槽程序大小、这将是您将来更新程序可用的最大程序大小、在本例中、它为(0x40000)(256KB)、为新固件(另一个0x40000)、NVS 空间(0x20000)(128Kb)和引导加载程序(0x10000)(64KB)留出空间。
2.使用计算出的值、转到 flash_map_backend.h 并更改中的值(我的情况是 DeviceFamily_CC13X2X7)
#elif defined(DeviceFamily_CC13X2X7) || defined(DeviceFamily_CC26X2X7) #define BOOTLOADER_BASE_ADDRESS 0x000A0000 #define BOOT_BOOTLOADER_SIZE 0x00010000-0x58 #define BOOT_PRIMARY_1_BASE_ADDRESS 0x00000000 #define BOOT_PRIMARY_1_SIZE 0x00040000 #define BOOT_SECONDARY_1_BASE_ADDRESS 0x00040000 #define BOOT_SECONDARY_1_SIZE 0x00040000
出于某种原因、引导加载程序的大小必须比分配的时隙小0x58。
3、更改 SysConfig/器件配置中闪存矢量表的地址(不执行此操作、程序在调试中正常运行、但不使用 uniflash 下载)
4.修改 mcuboot_config.h 以使用 MCUBOOT_OVERRIT_ONLY ,如果您使用例如 MCUBOOT_DIRTE_XIP ,您将无法使用加密,您必须为每个扇区的 cmd 和 SysConfig 指定启动闪存地址。 (我不建议这样做、因为有必要使用不同的参数为扇区1或2编译程序。)
5. 现在我们必须将.cmd 更改为插槽的大小、在本例中为(mcuboot_cc13x2x7_cc26x2x7.cmd)、并使用新的起始地址和大小(我还为新的 FW 和 NVS 添加了一些空间)。
#define NEW_FW_BASE 0x40000 #define NEW_FW_SIZE 0x40000 #define FLASH_BASE 0xA0000 #define FLASH_SIZE 0x10000 #define RAM_BASE 0x20000000 #define RAM_SIZE 0x24000 #define GPRAM_BASE 0x11000000 #define GPRAM_SIZE 0x2000 /* System memory map */ MEMORY { /* Application stored in and executes from internal flash */ FLASH (RX) : origin = FLASH_BASE, length = FLASH_SIZE NEW_FW (RWX) : origin = NEW_FW_BASE, length = NEW_FW_SIZE /* Application uses internal RAM for data */ SRAM (RWX) : origin = RAM_BASE, length = RAM_SIZE /* Application can use GPRAM region as RAM if cache is disabled in the CCFG (DEFAULT_CCFG_SIZE_AND_DIS_FLAGS.SET_CCFG_SIZE_AND_DIS_FLAGS_DIS_GPRAM = 0) */ GPRAM (RWX): origin = GPRAM_BASE, length = GPRAM_SIZE }
在应用程序端、我们还必须对.cmd 进行一些更改(我将为此使用闪烁示例)。
//size of the programs #define PROGRAM_SIZE 0x40000 #define HDR_SIZE 0x80 #define FLASH_BASE HDR_SIZE #define FLASH_SIZE PROGRAM_SIZE-HDR_SIZE #define RAM_BASE 0x20000000 #define RAM_SIZE 0x24000 #define GPRAM_BASE 0x11000000 #define GPRAM_SIZE 0x2000 /* Export the header address to the blinky app */ MCUBOOT_HDR_BASE = HDR_SIZE;
7.在构建更改中的后处理步骤中:
sign --header-size 0x80 --align 4 --slot-size 0x56000 --version 1.0.0 --pad-header --pad至
sign --header-size 0x80 --align 4 --slot-size 0x40000 --version 1.0.0 --pad-header --pad
现在、您应该能够使用 MCU 引导加载程序加载闪烁负载(以检查一切都在达到这一点)。
为此、请执行以下操作:
1-打开 uniflash。
2-转至设置并选择:擦除所有未保护的扇区。 (具有空起点)
加载生成的 MCUBoot 的.Hex 文件(不是闪烁!)。
4 -转到设置并选择:仅必要部分(保留扇区内的非触摸内容)
在0x40000中(在本例中)加载闪烁程序生成的.bin 文件。
6 -在 trace.c 中以选定的 iTM 速度打开调试端口的串行终端、在本例中为115200 (以便与我的主程序中的相同)。
重置器件。
如果一切运行正常、电路板应呈红色闪烁、然后是绿色闪烁3次(次级扇区中的良好程序)、再开始呈绿色闪烁和红色闪烁。
在串行终端中,你应该得到一个日志与大量的[01],我所做的是将它复制到记事本++并将它替换为没有提供更可读的文本(如果有人知道如何摆脱这个[01],这将是非常感激的)。
3-如何在 MCUBoot (EC256)中解密应用程序并对应用程序进行加密
按照卢卡斯·霍尔岑的指示和大量的研究,我能够使加密工作,但有一些关键的步骤需要找到。
将 Tiny crypt TI 实现从复制到 MCUBoot 文件夹并链接到:cc13xx_cc26xx_sdk\source\ti\mesh\Zephyr\Subsys\Bluetooth\mesh\tinycrypt
2-在 ecc_platform_special.c 中实现 CSPRNG 函数:
void default_CSPRNG(uint8_t *dest, unsigned int size) { TRNG_Params trngParams; TRNG_Handle trngHandle; // Initialize TRNG TRNG_Params_init(&trngParams); trngHandle = TRNG_open(0, &trngParams); if (trngHandle == NULL) { // Error in initialization return; } // Generate random numbers TRNG_getRandomBytes(trngHandle, dest, size); // Close TRNG TRNG_close(trngHandle); }
感谢 ChatGPT (是的,我正在尝试写一些代码与聊天 GPT 以查看结果,到目前为止还不错)。
三相加 SysConfig 中的 TRNG 支持。
4-修改 mcuboot_config.h:
注释掉:
MCUBOOT_USE_TI_CRYPTO
包括
#define MCUBOOT_OVERWRITE_ONLY #define MCUBOOT_ENC_IMAGES 1 #define MCUBOOT_ENCRYPT_EC256 #define MCUBOOT_USE_TINYCRYPT 1 #define MCUBOOT_SIGN_EC256
5-更改 tc_CTR_MODE 功能。
rc = tc_ctr_mode(out, inlen, in, inlen, counter, &blk_off, ctx);至
rc = tc_ctr_mode(out, inlen, in, inlen, counter, ctx);
在 AES_CTR.h 中、这消除了我之前未使用的偏移、并且是 TI Tinicrypt 中使用的实现。
6-在程序中取消注释请求的函数,该函数将产生错误。
7-尝试编译它,它现在应该可以工作。
8-in 应用程序端现在使用–encrypted 命令和所需的证书(首先请参阅第4部分)(未使用示例证书进行测试):
${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/tools/common/mcuboot/imgtool sign --header-size 0x80 --align 4 --slot-size 0x40000 --version 1.1.1 --pad-header --pad --key ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/source/third_party/mcuboot/root-ec-p256.pem --encrypt ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/source/third_party/mcuboot/root-ec-p256.pem ${ProjName}-noheader.bin ${ProjName}_Encripted.bin
恭喜您、现在引导加载程序具有解密功能、我们知道如何加密程序、那么我们如何生成密钥并加以实施呢?
4-生成您自己的证书并实施密钥。
安装 python 3来运行我们将要使用的 imgtool 程序。
2.转至 sdk_path\source\third_party\mcuboot\source\scrips
3.在那里打开一个终端。
4.若要生成证书,请使用:
python imgtool.py keygen -k Test_certificate.pem -t ecdsa-p256
这将创建 Test_certificate.pem
5.我将创建另一个来签署标题:
python imgtool.py keygen -k Test_certificate_header.pem -t ecdsa-p256
6.现在关键点:应用程序签名需要公钥,加密需要私钥(这一点让我疯狂了一个星期)。
7. 要获取用于签名的公钥,请使用:
python imgtool.py getpub -k Test_certificate_header.pem -l c
并将它们复制/粘贴到 MCUBoot 第110行的 keys.c 中(记住包含长度! ! 并擦除或注释旧密钥)。
8. 若要获取私钥以进行加密,请使用:
python imgtool.py getpriv --minimal -k Test_certificate.pem
并将其复制/粘贴到第271行的 keys.c 中(记住包括长度! 并擦除或注释旧密钥)。
9.现在、我们必须使用此证书创建应用程序映像、如果您位于 SDK 的默认文件夹中、请使用以下内容修改编译后处理步骤:
${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/tools/common/mcuboot/imgtool sign --header-size 0x80 --align 4 --slot-size 0x40000 --version 1.1.1 --pad-header --pad --key ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/source/third_party/mcuboot/ scrips/ Test_certificate_header.pem --encrypt ${COM_TI_SIMPLELINK_CC13XX_CC26XX_SDK_INSTALL_DIR}/source/third_party/mcuboot/scrips/ Test_certificate.pem ${ProjName}-noheader.bin ${ProjName}.bin
这样、您就可以使加密正常工作、程序加载的方式与不加密的方式相同、但应考虑到由于解密、引导需要更长时间。
非常感谢 Arthur R.和 Lucas Holzen 提供的帮助,如果有任何错误或需要澄清,反馈将非常感谢。
。