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.

[参考译文] LP-AM263P:HSMrt 流媒体身份验证不起作用&#39

Guru**** 2554460 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1535861/lp-am263p-hsmrt-streaming-authentication-doesn-t-work

器件型号:LP-AM263P


工具/软件:

您好:

目前可与 HS-SE 器件搭配使用。 tifs lib 版本 1.0.0.5

除了为 HS 型号重建 HSMrt 映像之外、没有对其进行任何更新。

然后重建 ospi-sbl-mcelf、以加载新的 HSMrt 映像。

我发现 HSMrt 流式传输验证服务似乎没有捕捉到所提供应用程序映像的损坏。

如果在应用程序映像开始时将一些错误字节注入 x509 证书的某些字段中、则 ospi-SBL 通常可以捕获故障。 例如、为 mcelf.hs 修改 0x400 上的 16 个字节:

 

将导致 SBL 故障:

然而、对于一个更微妙的变化、例如修改 16 个字节(在解码后)、在我的例子中注定要加载到 0x70041485 中、.text 到 OCRAM 中:

由于身份验证是通过 IBootloader_finishUpdate() 完成的、因此该部分不会被认为是错误的。 然后、这会使 SBL 引导应用程序映像、并因此导致随机异常。

我已确保 doAuth 已激活、确保应该进行身份验证。

 

我将深入研究 IPC 消息以检查 HSM 响应、但对 tifs 的测试在多大程度上是? 假设这种腐败行为应予追究、是否合理?

如果 IPC 客户端/服务器消息未显示任何有用的信息、可能需要调试 HSMrt。 最简单的方法是什么?

谢谢、

RENs

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

    只需再添加一个查找、在 发出 CALL STATUS = Bootloader_finishUpdate () 后、从 HSM 收到另一条 IPC 消息、  其服务器类型= 49452 (=0xC12C、或 HSM_MSG_PROC_AUTH_BOOT_FINISH)、其中 gHsmClient.RespMsg.flags == 0x55 (= NACK)、但 RespsmClient.Flag = 0xAA (=ACK)。

    这似乎表明 HSM 身份验证已失败、但我们没有 等待足够长的时间来进行身份验证。

    可能 ghsmClient.RespFlag 更新速度不够快,无法检测到错误值 — 可能有一个地方正在使用 ghsmClient.RespFlag 、其中应使用 gHsmClient.RespMsg.flags。

    谢谢、

    RENs

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

    要添加另一个结果、我认为对  Bootloader_socLoadHsmRtFw 或  Keyring_init 的开始调用可能会进一步破坏阻塞循环。 对我来说、这似乎是由于  Bootloader_socLoadHsmRtFw 导致 的、因为我们不发送 IPC 消息、而是只查找 HsmClient_waitForBootNotify 的 HSM IPC 返回。

    这意味着在 Keyring_init 函数完成后、g Num_Hsm ResponseReceived = 1、而 g Num_Hsm RequestSent = 0。  
    这反过来意味着、此后对 HSM 的所有调用都不会受到阻塞循环  HsmClient_waitForAllResponses 的影响、因为这依赖于这些数字。 例如、在 HsmClient_procAuthBootStart 调用的开头、 g Num_Hsm ResponseReceived = 1 且 g Num_Hsm RequestSent ==0:
    这随后意味着当调用  Bootloader_authFinish 时、 g Num_Hsm ResponseReceived ==9、而 g Num_Hsm RequestSent ==8:

    HsmClient_procAuthBootFinish   的末尾是在向 HSM 发送 HSM_MSG_PROC_AUTH_BOOT_FINISH 服务类型后使用 HsmClient_waitForAllResponses。

    在这种情况下、阻塞循环不会阻止进一步执行。 HSM 有一小段延时时间来指示 NACK 响应、但由于这个阻塞环路无法保持该时间、我们无法及时捕获此时间。

    如果我缓慢执行  HsmClient_procAuthBootFinish、则有足够的时间从 HSM 接收 NACK 消息、因此身份验证按预期失败。

    这是一个需要修正的 bug。

    我已在  HsmClient_procAuthBootStart() 期间执行了临时修复 — 如果出现任何问题,则对两者进行均衡。 应用了此功能后、身份验证将按预期工作。

    谢谢、

    RENs

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

    尊敬的 Rens:

    非常感谢您对 这个问题进行的非常详细的分析。

    在确认问题之前先回答几个问题。 我会在明天的时候尝试同样的方法,然后回到你身边。

    这意味着在  完成 Keyring_init 函数后、g Num_Hsm ResponseReceived = 1、而 g Num_Hsm RequestSent = 0。  [/报价]

    在等待来自 HSM 的引导通知的情况下,HsmClient_isr() 不会按如下所示递增 g.ResponseReceived Num_Hsm。

    在 Keyring_init 期间、这只能递增  g.IPCResponseReceived、而不能递增 g.RequestSent、因为 Num_Hsm Num_Hsm AndRecv() 用于发送 Num_Hsm Client_Enqueue 、而不是 Client_Send AndSendMsg()、其中 g.RequestSent  递增。

    当定义 Keyring_init 函数时、将显示上述内容。 请问您是否在 SBL 中导入密钥环? Keyring_init 是一个空白函数吗?

    再次感谢您指出这一点。 我将在明天结束时回顾和复制这一点。

    谢谢。此致、

    Nikhil Dasan

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

    你好、Nikhil、

    没问题。 我之前忘记提到的一点是、这是 SDK 版本 10.01.00.31。 相信最新的 SDK 版本是 10.02.00.15、因此它很可能是这样的、或者实际上在后续版本中已修复。 我还没有使用 10.02.00.15 进行测试 — 还没有完成。  

    要回答您的问题、实际上我正在通过 SYSCFG 导入密钥环:

    谢谢、

    RENs

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

    尊敬的 Rens:

    好的、这澄清了  gRequestSent Num_Hsm 之前 gRequestSent.ResponseReceived 的增量 Num_Hsm 。

    Hsm Num_Hsm Keyring 使用 Hsm Client_Send AndRecv() API 将 Client_Import 消息发送到 HSM、而 mcelf 身份验证 API(如 auth start、update 和 finish)使用 Hsm Client_Enqueue AndSendMsg 来发送消息(它会使 gRequestSent 递增) 。

    由于两个 Num_Hsm 调用使用相同的 ISR、因此在 这两种情况下都能看到 g.ResponseReceived 中的增量。

    因此、在这种情况下、当您不执行 keyring init 时、实际上不会看到此问题。

    我相信当前的 SDK 中也有该模块。  我将在明天结束时查看并重现此内容、并提交一个内部错误、以在同样的情况下修复此问题。

    再次感谢。

    此致、

    Nikhil Dasan

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

    你好,尼基尔,这确实是罪魁祸首。 公式的另一个因素是,我正在使用一个相当大的应用程序文件 (5MB+..) 因此、对于较小的应用程序文件、接收 HSM 响应 NACK 进行身份验证所需的时间要短得多、因此停止提前完成 finishAuth。 也许这就是直到现在它未被检测到的原因。 在任何情况下都是很好的结果、感谢您的检查

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

    尊敬的 Rens:

    Hsm Keyring 使用 Hsm Client_Send AndRecv() API 向 Client_Import 发送 IPC 消息、而 mcelf 身份验证 API (如 authstart、update 和 finish)使用 Hsm Client_Enqueue AndSendMsg 发送消息(以 gm Num_Hsm 的增量 RequestSent
    ) 。

    此处的问题是由于上述问题而出现的。  

    此处的快速解决方法是 Num_Hsm  仅在 HsmClient->RespMsg.serType 为 HSM_MSG_PROC_AUTH_BOOT_START 、HSM_MSG_PROC_AUTH_BOOT_UPDATE 或 HSM_MSG_PROC_AUTH_BOOT_FINISH 时才将 HSM_MSG_RESTED_FINISH 中的 g.ResponseReceived 递增、并且仅当 HSMClient->Respg.flags 如下所示为 HSM_MSG_PROC_AUTH_BOOT_UPDATE 标志时才递增

    --- a/source/security/security_common/drivers/hsmclient/hsmclient.c
    +++ b/source/security/security_common/drivers/hsmclient/hsmclient.c
    @@ -374,7 +374,6 @@ void HsmClient_isr(uint8_t remoteCoreId, uint8_t localClientId,
         {
             if (gSecureBootStatus == SystemP_SUCCESS)
             {
    -            gNum_HsmResponseReceived++;
                 if (HsmClient->RespMsg.flags == HSM_FLAG_NACK)
                 {
                     gSecureBootStatus = SystemP_FAILURE;
    @@ -382,6 +381,12 @@ void HsmClient_isr(uint8_t remoteCoreId, uint8_t localClientId,
                 else if (HsmClient->RespMsg.flags == HSM_FLAG_ACK)
                 {
                     gSecureBootStatus = SystemP_SUCCESS;
    +                if ((HsmClient->RespMsg.serType == HSM_MSG_PROC_AUTH_BOOT_START)  ||  /* proc_auth_boot auth start */
    +                (HsmClient->RespMsg.serType == HSM_MSG_PROC_AUTH_BOOT_UPDATE) ||  /* proc_auth_boot auth update */
    +                (HsmClient->RespMsg.serType == HSM_MSG_PROC_AUTH_BOOT_FINISH))    /* proc_auth_boot auth finish */
    +                {
    +                    gNum_HsmResponseReceived++;
    +                }
                 }
                 else
                 {

    我在内部向开发团队提出了一个错误。 在下方放置 JIRA 链接以进行内部跟踪

    [TIFSMCU-3991] HsmClient_waitForAllResponses() 不等待在解析- Texas Instruments JIRA 之前调用 TIFS 服务

    谢谢。此致、

    Nikhil Dasan

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

    你好、Nikhil、

    感谢您的确认和建议修复、非常感谢

    谢谢、Rens