This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SBL-AM243X:在 MCU-PLUS-SDK 外部使用 TISCI 进行映像身份验证

Guru**** 2909130 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1566692/mcu-plus-sdk-am243x-image-authentication-using-tisci-outside-of-sbl

器件型号:AM243X - MCU-PLUS-SDK


工具/软件:

您好、
我们目前正在为项目实现软件更新功能、希望利用引导加载程序身份验证来验证在 SBL 之外接收到的映像。

简明背景 :在带有  AM243x MCU+ SDK 11.01.00 和 SYSCFG 1.22 的 AM243X-LP 上、我们有一个在 R5F0-0 内核 上运行的应用程序、它使用 ICSS 上的 lwIP 协议栈托管 REST API 服务器(我们自己的实施)。 我们在一个 FreeRTOS 任务中将图像作为 TCP 分段接收、并使用 FreeRTOS 队列将其发送到另一个将图像写入闪存的任务。  到目前为止一切顺利。  我们目前是 GP、但最终将以 HS-SE 为目标。 我们的 SBL 在很大程度上 sbl_ospi_multi_partition以示例为基础。

一旦我们收到映像、但在“提交“ 更新之前、我们希望可以使用Bootloader_socAuthImage来验证映像 x.509 证书。 “承诺“更新是指以某种方式告诉 我们的自定义 SBL 新映像的位置(此机制仍在进行中)并重新启动器件。 我们 此步骤的原因有两个方面:a) 映像完整性 — 确保映像通过线路完好无损(这里需要一些校验和机制)、更重要的是 b) 验证证书、以确保在器件重新启动时、映像不会被 SBL 拒绝、从而“冻结“器件、或者至少会立即引入一些备用引导机制。

代码如下所示:

// Once I receive the first update chunk in my FreeRTOS task that stores the image in Flash memory,
// I can find out the x509 certificate length and store it
// Chunk data is: char chunkData[1460]

mFlashOffset = 0x200000u; // Hardcoded destination for now

mX509CertificateLength = Bootloader_getX509CertLen(reinterpret_cast<uint8_t*>(mpChunk->chunkData)); // 1654
if(mX509CertificateLength <= 0x100 || mX509CertificateLength > 0x800)
{
  // Abort update. We use the same magic numbers as TI SDK
}

// ...

// Once we have received the entire image

Flash_enableDacMode(mFlashHandle); // SystemP_SUCCESS

uint32_t certificateLoadAddress = mFlashOffset + SOC_getFlashDataBaseAddr(); // 0x60200000

uint32_t imageLength = Bootloader_getMsgLen(mX509Certificate.data(), mX509CertificateLength); // 439520

uint32_t cacheAlignedLength = (mX509CertificateLength + imageLength + 128) & ~(127); // 441216

CacheP_wbInv(reinterpret_cast<void*>(certificateLoadAddress), cacheAlignedLength, CacheP_TYPE_ALL);

const int32_t cVerifyStatus = Bootloader_socAuthImage(certificateLoadAddress); // SystemP_FAILURE

CacheP_inv((void*)certificateLoadAddress, cacheAlignedLength, CacheP_TYPE_ALL);

Flash_disableDacMode(mFlashHandle); // SystemP_SUCCESS

如果我逐步Bootloader_socAuthImage达到之后 Sciclient_procBootAuthAndStart、我会得到:

retVal	                        int	                0	          0x701A79CC
(respParam).flags	            unsigned int	    0	          0x701A7998
(respParam).respPayloadSize	    unsigned int	    20	          0x701A79A0
(respParam).pRespPayload	    unsigned char *	    (see below)	  0x701A799C

pRespPayload as 8-bit Hex - TI style: 00	00	00	00	00	00	00	00	01	00	00	00	00	00	00	00	02	01	0A	70

同一映像sw.release.appimage.hs_fs 已成功签名、并已通过我们启用了身份验证的 SBL 成功加载(在 SYSCFG 中取消选中“Disable Auth for Application Image“)。 我已经检查了 sysfw 日志的更多信息基于这里的评论 downloads.ti.com/.../PROC_BOOT.html 但没有任何相关.

我的下一个操作是寻找 mbedtls 等器件并自己进行验证、但我希望能重新使用引导加载程序逻辑。

我的问题是:
-是否可以在 SBL 之外使用 Bootloader_socAuthImage 进行 X509 映像身份验证?
-我有什么方法可以获得更多的信息,为什么验证失败,如果上述是可能的?
-您是否有任何建议,建议如何更好地处理我们的用例,验证通过以太网接收并保存到闪存的映像?

提前感谢、
Vaclav
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    -是否可以在 SBL 之外使用 Bootloader_socAuthImage 进行 X509 映像身份验证?

    从理论上讲、是的。 请注意、将根据 HSSE 设备上的活动编程密钥进行身份验证。

    因此、可能存在一两个问题情况、比如这种方法不能与 KEYREV 更新(将活动密钥从 SMPK 切换到 BMPK)在同一周期内使用。 更新 KEYREV 时、应刷写使用 BMPK 签名的映像。 但是、在同一下电上电过程中、电路板上的活动密钥仍为 SMPK、因此身份验证将失败。

    -如果上述情况允许、我可以通过任何方式获取更多信息为什么身份验证失败?

    请共享 SYSFW 日志。

    您是否有建议说明如何以最佳方式处理我们的用例:验证通过以太网接收并保存到闪存中的图像?

    理想情况下、应验证映像以便在出厂时引导。 然后、正确接收和刷写映像就是一个问题。 只要完成此操作、器件刷写和复位后映像身份验证就不会失败。

    此致、

    Prashant

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Prashant、

    感谢您的答复。 以下是同一过程中两次单独运行的两个 SYSFW 日志。 ools/sysfw/trace_parser/sysfw_trace_parser.py为方便起见、我已将解析后的两个日志(含 t)包括在原始日志中:



     e2e.ti.com/.../trace_2D00_log_5F00_sw_5F00_update_5F00_sysfw_2D00_parsed.loge2e.ti.com/.../trace_2D00_log_5F00_sw_5F00_update_5F00_sysfw.loge2e.ti.com/.../trace_2D00_log_5F00_putty_5F00_update_2D00_parsed.loge2e.ti.com/.../trace_2D00_log_5F00_putty_5F00_update.log

    我们的目标是支持软件更新、即使设备已与客户现场部署、 我们也不一定能完全控制更新的位置。

    谢谢、
    Vaclav

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ools/sysfw/trace_parser/sysfw_trace_parser.py为了方便起见、我已将两个已解析的日志(含 t)包括在原始日志中:

    感谢您的日志。 让我检查一下、然后返回给您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    共享的 SYSFW 日志中有两个 PROC_AUTH_BOOT 消息实例。 对于这两种情况、我在日志中看不到任何错误。 您如何捕获 SYSFW 日志(MAIN_UART1 或内存缓冲区)?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这两个都是 MAIN_UART2。 我 找不到有关如何从内存缓冲区中提取日志的说明。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    两者均为 MAIN_UART2。

    您是指 MAIN_UART1、因为 SYSFW 日志仅在此端口上提供吗?

    在请求身份验证之前、您是否已检查代码中是否正确读取了图像长度 (imageLength) 和证书长度 (mX509CertificateLength)?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉、是的、我指的是 UART1。 我将再次检查这些值并返回给您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    更新:对不起沉默,这不再是我们的优先事项。 因此、我没有时间进一步研究这一点。 我们计划在下个月进行面对面的 TI 拜访、因此我们计划在会议期间提出这个问题、如果我们为我们找到合适的解决方案、我将在此处发布更新信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的更新。 如果需要任何帮助、请告诉我!