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.

[参考译文] PROCESSOR-SDK-AM62X:【OPTEE RPMB SECURE STORAFE】AM62x SDK 升级后 RPMB 验证失败(8.6→10.01)–DKEK 不匹配

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1502983/processor-sdk-am62x-optee-rpmb-secure-storafe-rpmb-verification-failure-after-am62x-sdk-upgrade-8-6-10-01-dkek-mismatch

器件型号:PROCESSOR-SDK-AM62X
主题中讨论的其他器件:AM62L

工具/软件:

尊敬的 TI 社区:

将 AM62x SDK 从升级到  版本8.6至10.01 、我们遇到了  OP-TEE RPMB 安全存储错误  ("RPMB 验证失败")。 在调试过程中、我们发现了   新旧 SDK 的 DKEK 值不同 、导致验证失败。

报错日志如下:μ s

D/TC:? 0 ldelf_load_ldelf:110 ldelf load address 0x40007000
D/LD:  ldelf:142 Loading TS 8c2e0728-a3fb-4ccc-96b0-9a6498db1aec
F/TC:? 0 trace_syscall:147 syscall #3 (syscall_get_property)
F/TC:? 0 trace_syscall:147 syscall #5 (syscall_open_ta_session)
D/TC:? 0 ldelf_syscall_open_bin:163 Lookup user TA ELF 8c2e0728-a3fb-4ccc-96b0-9a6498db1aec (REE)
D/TC:? 0 ldelf_syscall_open_bin:167 res=0
F/TC:? 0 trace_syscall:147 syscall #7 (syscall_invoke_ta_command)
F/TC:? 0 trace_syscall:147 syscall #11 (syscall_mask_cancellation)
F/TC:? 0 trace_syscall:147 syscall #7 (syscall_invoke_ta_command)
F/TC:? 0 trace_syscall:147 syscall #3 (syscall_get_property)
F/TC:? 0 trace_syscall:147 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:147 syscall #8 (syscall_check_access_rights)
D/TC:? 0 legacy_rpmb_init:1142 Trying legacy RPMB init
D/TC:? 0 rpmb_set_dev_info:1111 RPMB: Syncing device information
D/TC:? 0 rpmb_set_dev_info:1113 RPMB: RPMB size is 32*128 KB
D/TC:? 0 rpmb_set_dev_info:1114 RPMB: Reliable Write Sector Count is 1
D/TC:? 0 rpmb_set_dev_info:1116 RPMB: CID
D/TC:? 0 rpmb_set_dev_info:1117 000000009e8b0bd0  d6 01 03 38 38 41 33 39  38 11 eb bf d1 a0 1b 00
D/TC:? 0 legacy_rpmb_init:1162 RPMB INIT: Deriving key
I/TC: RPMB: Using generated key
F/TC:? 0 k3_sec_proxy_send:131 Verifying the thread
F/TC:? 0 k3_sec_proxy_verify_thread:71 Check for thread corruption
F/TC:? 0 k3_sec_proxy_verify_thread:88 Check for thread direction
F/TC:? 0 k3_sec_proxy_verify_thread:100 Check for thread queue
F/TC:? 0 k3_sec_proxy_verify_thread:113 Success
F/TC:? 0 k3_sec_proxy_recv:193 Verifying thread
F/TC:? 0 k3_sec_proxy_verify_thread:71 Check for thread corruption
F/TC:? 0 k3_sec_proxy_verify_thread:88 Check for thread direction
F/TC:? 0 k3_sec_proxy_verify_thread:100 Check for thread queue
F/TC:? 0 k3_sec_proxy_verify_thread:113 Success
I/TC: HUK Initialized
D/TC:? 0 legacy_rpmb_init:1176 RPMB INIT: Verifying Key
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x89
D/TC:? 0 tee_rpmb_resp_unpack_verify:949 MAC mismatched:
E/TC:? 0 legacy_rpmb_init:1191 Verify key failed! 0xffff000f
E/TC:? 0 legacy_rpmb_init:1192 Make sure key here matches device key
E/LD:  copy_section_headers:1135 sys_copy_from_ta_bin
E/TC:? 0 ldelf_init_with_ldelf:152 ldelf failed with res: 0xffff000f
D/TC:? 0 tee_ta_open_session:696 init session failed 0xffff000f
TEEC_Opensession failed with code 0xffff000f origin 0x3

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

    1/。 进行了从 Linux SDK 9.x (或 Yocto Kirkstone)开始的 TIFS 更新、以修复 Linux SDK 8.x (或 Yocto Dunfell)中的 TIFS DKEK 问题、其中在 OPTEE 调用 TIFS DKEK API 以获取 HUK (硬件唯一密钥)以促进 OPTEE 安全存储操作时、返回 Linux SDK 8.x 中 TIFS 中的"常量"DKEK"。
    a. TIFS DKEK API (如下)上的修复程序是从 TIFS 9.1.8 (Linux SDK 9.1.0.8)开始添加的。
    https://software-dl.ti.com/tisci/esd/latest/2_tisci_msgs/security/dkek_management.html
    b.此外、从 TIFS 9.2.7 (Linux SDK 9.2.1.9)开始添加了两个新的 TIFS API (如下所列)。
    TISCI 在线指南中尚未发布这两种新 API。

    /** Message to derive a constant DKEK and set SA2UL DKEK register */
    #define TISCI_MSG_SA2UL_SET_DKEK_CONST          (0x902AU)
     
    /** Message to derive a constant DKEK and return it via TISCI */
    #define TISCI_MSG_SA2UL_GET_DKEK_CONST          (0x902BU)

    2/。 解决这个问题的一个建议
    -升级到最新的 TIFS (TIFS 9.2.7或更新版本)
    -使用两个 API (1B)获取旧的"常量"DKEK 和用于 OPTEE 安全存储操作(即解密)的 HUK
    -使用两个 DKEK API (1A)获取正确的 DKEK,并使用 HUK 进行 OPTEE 安全存储操作(即重新加密)

    此致、
    - Hong

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

    感谢您的答复。 但是、我有一些后续问题:

    我们已升级到  SDK 10.1的文档 、哪一个版本应包含最新的 TIFS 版本以及以下 DKEK API、正确?

    /** Message to derive a KEK and return it via TISCI  (SDK 9.1.0.8) */
    TISCI_MSG_CRYPTO_GET_DKEK         (0x9029U)
    
    /** Message to derive a constant DKEK and set SA2UL DKEK register (SDK 9.2.1.9) */
    #define TISCI_MSG_SA2UL_SET_DKEK_CONST          (0x902AU)
     
    /** Message to derive a constant DKEK and return it via TISCI (SDK 9.2.1.9) */
    #define TISCI_MSG_SA2UL_GET_DKEK_CONST          (0x902BU)

    问题:

    1. 为什么 SDK 10.1中的 OP-TEE 4.4仍然使用较旧版本 TI_SCI_MSG_SA2UL_GET_DKEK (0x9029)而不是TISCI_MSG_CRYPTO_GET_DKEK 用于 DKEK 检索的较新版本(也是0x9029)?
      optee_os/core/arch/arm/plat-k3/drivers/ti_sci.c
      int ti_sci_get_dkek(uint8_t sa2ul_instance,
      		    const char *context, const char *label,
      		    uint8_t dkek[SA2UL_DKEK_KEY_LEN])
      {
      	struct ti_sci_msg_req_sa2ul_get_dkek req = { };
      	struct ti_sci_msg_resp_sa2ul_get_dkek resp = { };
      	struct ti_sci_xfer xfer = { };
      	int ret = 0;
      
      	ret = ti_sci_setup_xfer(TI_SCI_MSG_SA2UL_GET_DKEK, 0,
      				&req, sizeof(req), &resp, sizeof(resp), &xfer);
      	if (ret)
      		return ret;
      
      	req.sa2ul_instance = sa2ul_instance;
      	req.kdf_label_len = strlen(label);
      	req.kdf_context_len = strlen(context);
      	if (req.kdf_label_len + req.kdf_context_len >
      	    KDF_LABEL_AND_CONTEXT_LEN_MAX) {
      		EMSG("Context and Label too long");
      		return TEE_ERROR_BAD_PARAMETERS;
      	}
      	memcpy(req.kdf_label_and_context, label, strlen(label));
      	memcpy(req.kdf_label_and_context + strlen(label), context,
      	       strlen(context));
      
      	ret = ti_sci_do_xfer(&xfer);
      	if (ret)
      		return ret;
      
      	memcpy(dkek, resp.dkek, sizeof(resp.dkek));
      	memzero_explicit(&resp, sizeof(resp));
      	return 0;
      }
      
    2. 只需将 OP-TEE 修改为使用即可、 TISCI_MSG_SA2UL_GET_DKEK_CONST 而不是使用即可  TI_SCI_MSG_SA2UL_GET_DKEK(in fuction ti_sci_get_dkek)
    3. 功能差异

      • 什么是  旧的和新的 DKEK API 之间的差异 什么  优势  是否有新的 DKEK?存在  缺点  对旧的 DKEK ?
      • CAN  双 DKEK 验证  (如果新的 dkek 验证失败、请使用旧的 dkek)是否要实现向后兼容?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、

    我在一段时间前发布了我的问题、我仍在等待回复。  

    您能否检查并查看我何时可以收到回复? 如果您还需要我帮助您解决我的问题、请随时告诉我。

    感谢您关注此问题。

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

    你好 Hong

    您能否在内部对此进行优先排序、因为这会使客户无法继续推进其项目。 谢谢。

    此致

    Zekun

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

    您好 Zekun

    洪某目前正在休病假。 此主题的回复可能会延迟一周左右。 将评估在 Hong 不在办公室时是否可以将其重新分配给其他人  

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

    你好  

    以下是 Hong 外出时与开发团队讨论后的一些指导  

    1. 为什么 SDK 10.1中的 OP-TEE 4.4仍然使用较旧版本 TI_SCI_MSG_SA2UL_GET_DKEK (0x9029) 是否需要使用较新的 TISCI_MSG_CRYPTO GET_DKEK (也称为0x9029)来检索 DKEK?
    2. 是否只需修改 OP-TEE 即可使用 TISCI_MSG_SA2UL_GET_DKEK_CONST 而不是 TI_SCI_MSG_SA2UL_GET_DKEK (在函数 ti_sci_get_dkek 中)
    3. 功能差异
    • 什么是 旧的和新的 DKEK API 之间的差异 什么 优势 是否有新的 DKEK?存在 缺点 对旧的 DKEK ?
    • CAN 双 DKEK 验证 (如果新的 dkek 验证失败、请使用旧的 dkek)是否要实现向后兼容?

     

    在#1上、它们是相同的 API、无行为差异、重命名 API 以使服务名称通用。 我们保留了旧名称也不会破坏任何兼容性。

    将加密相关消息从 SA2UL 重命名为 crypto、是为了使该服务通用、而不会在消息中包含加密加速器名称。 我们从 SA2UL 改为 dthe 以表示 AM62L、并计划使用相同的 TISCI 消息。

     

    TI_SCI_MSG_SA2UL_GET_DKEK == TISCI_MSG_Crypto_GET_DKEK

    衍生的 KEK TISCI 说明—TISCI 用户指南

     

     

    在#2上、TISCI_MSG_SA2UL_GET_DKEK_CONST 是  已使用之前 API 的客户的临时解决方案。

    关于#3A)我们建议并鼓励使用最新的 API 和 SDK 10.1

    在#3 b)中、您能否进一步说明为什么需要这一点? 您是否在现场部署了设备等?

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

    我们需要一个兼容性解决方案。如您建议的那样、您的团队建议使用最新的 API。 检索旧的 DKEK 仅用作临时 解决方案。 我们的具体要求是:对于尚未使用 RPMB 密钥编程的新核心板、我们希望它们能对照新的 DKEK 进行验证、同时保持与已使用旧的 DKEK 编程的核心板的兼容性。 因此、我们需要一个双 DKEK 兼容性解决方案、如果新 DKEK 的验证失败、系统会自动返回到旧的 DKEK。 这种方法可确保具有传统 DKEK 的核心板能够通过验证、而新的核心板将使用新的 DKEK 进行验证。

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

    嗨、Xiaoshui

    感谢您提供更多背景信息。 不幸的是,由于各种原因,我们无法支持双 DKEK 兼容性请求  

    旧的 DKEK 仅可用于帮助迁移到新的 DKEK。 为了向后兼容性、不应该回退到使用它、 新的 API 是更稳健的、以及我们计划支持的长期功能。  

    此致

    Mukul  

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

    尊敬的 Xiaoshui:
    由于 DKEK 安全问题、不应在任何系统中使用 Linux SDK 8.x 中的两个旧 DKEK API (+早期的 API)。
    a/。 对于使用 Linux SDK 8.x (+早期版本)部署的系统、需要按照我第一次回复中的说明进行系统更新。
    -升级到最新的 TIFS (TIFS 9.2.7或更高版本)
    -使用两个 API (B)来获取旧的"常量"DKEK 和用于 OPTEE 安全存储操作(即解密)的 HUK
    (TISCI_MSG_SA2UL_SET_DKEK_CONST/TISCI_MSG_SA2UL_GET_DKEK_CONST)
    -使用两个 DKEK API (A)获取正确的 DKEK,并使用 HUK 进行 OPTEE 安全存储操作(即重新加密)
    (TISCI_MSG_SA2UL_SET_DKEK/TISCI_MSG_SA2UL_GET_DKEK)
    b/。 对于采用 SDK 9.x 或更高版本(TIFS 9.2.7或更高版本)的新系统、
    -使用两个 DKEK API (A)获取正确的 DKEK,并使用 HUK 进行 OPTEE 安全存储操作
    (TISCI_MSG_SA2UL_SET_DKEK/TISCI_MSG_SA2UL_GET_DKEK)
    此致、
    - Hong