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.

[参考译文] CC2745R10-Q1:密钥库 — 建议使用什么方法来保护存储在 PSA 密钥库中的预共享密钥、以免意外覆盖或擦除?

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1661827/cc2745r10-q1-keystore---what-is-the-recommended-way-to-protect-a-pre-shared-key-stored-in-the-psa-keystore-against-accidental-overwrite-or-erase

器件型号: CC2745R10-Q1

您好、

客户有以下 4 个问题:

1.是否允许在已配置密钥后将 PSA 密钥库闪存区域配置为只读?
2. PSA_crypto_init() 是否需要对 PSA 密钥库区域的写访问权限、例如更新元数据、验证密钥库、执行恢复或与 HSM Asset Store 同步状态?
3.如果密钥库包含寿命为 0x00000101 的持久密钥 (PSA_KEY_PERSIENT_DEFAULT + PSA_KEY_LOCATION_HSM_ASSUT_STORE)、则 HSM/PSA 实现是否需要对密钥库进行写入访问、即使应用程序只想重复使用现有密钥也是如此?
4.保护存储在 PSA 密钥库中的预共享密钥不被意外覆盖或擦除的建议方法是什么?

 

目标:

我的目标是配置一次预共享密钥、然后防止应用程序或调试器意外修改或擦除密钥、同时仍允许 PSA_CRYTOM_INIT () 和正常加密操作正常工作。

 

环境:

我还想将 PSA 密钥库闪存区域保护为只读、以保护存储在密钥库中的预共享密钥。

密钥库位于地址 0xE6000 处。 我配置了主扇区 256-511 至 0xFDFFFFFF 的闪存保护选项、以便为包含密钥库的扇区范围启用写入/擦除保护。

但是、通过 CCS 重新刷写应用程序后、PSA_CRYTOM_INIT () 会失败、并显示:

PSA_ERROR_GENERAL_ERROR(–132)

如果我删除这种写/擦除保护、PSA_CRrypto_init () 就可以成功完成。

您能否澄清预期行为?

 

 

可以帮帮您吗?

 

多谢致以诚挚的问候

Marcus

 

 

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

    尊敬的 Marcus:

    pas_crypto_init() 将尝试在密钥库区域中擦除/写入元数据。 如果它无法擦除该元数据、它将失败并返回一个错误、该错误将变成您看到的一般错误。 在调用 PSA_CRrypto_init 之前、无法将密钥库区域设置为只读。

    要回答更具体的问题:


    1.这取决于,如果它们将所有密钥存储在密钥库区域,并且不希望导入新密钥或销毁密钥,这可能是可能的。 需要进行写入访问来更新密钥库区域的元数据、因此导入新密钥或销毁密钥等将需要该访问。 请注意、如果添加了写/擦除保护并调用了需要写入/擦除访问的函数、则会引发错误并需要处理它们。

    2.是的, PSA_CRYTOR_INIT () 要求能够在闪存的密钥库区域内写入/擦除元数据。

    3、将密钥存储在密钥库中需要写入访问权限、但一旦存储了密钥库、只需要读取访问权限。 此外、请注意、每次启动 PSA_CRYTOM_INIT () 时都需要进行写入访问。

    4、密钥库中的密钥被意外擦除或覆盖的可能性很低。 要执行此操作、用户必须 使用要销毁的密钥的确切密钥 ID 调用 PSA_DESTOY_KEY ()、或者写入/擦除密钥库区域中不应执行的部分。 但是、如果有可能发生这样的情况、则可以通过写入 VIMS 寄存器来设置写入/擦除保护。

    可以在运行时使用类似于以下代码的代码为密钥库扇区添加写保护。 请注意、这样做会锁定扇区、直到器件复位完成。

    #include
    #include DeviceFamily_constructPath (driverlib/flash.h)
    /*
     *对包含的扇区组应用 Sticky-0 写/擦除保护
     *地址。 在下一次复位之前、无法移除保护。
     *涵盖全部三个 VIMS 保护寄存器:
     * WEPRA — 扇区 0-31 (1 个扇区/位)
     * WEPRB0 — 扇区 32-255(8 个扇区/位)
     * WEPRB1 — 扇区 256-511(8 个扇区/位)
     */
    静态 void FlashProtectionSet(uint32_t 地址)
    {
      uint32_t regOffset;
      uint32_t 位;

      if ((address >= FLASH_MAIN_SIZE)||(0U !=(address &(FLASH_MAIN_SECTOR_SIZE - 1U)))))
      {
        返回;
      }

      if (address <(32u * FLASH_MAIN_SECTOR_SIZE))
      {
        位   =地址/ FLASH_MAIN_SECTOR_SIZE;
        regOffset = VIMS_O_WEPRA;
      }
      否则 if (address <(256U * FLASH_MAIN_SECTOR_SIZE))
      {
        位   =地址/(8U * FLASH_MAIN_SECTOR_SIZE);
        regOffset = VIMS_O_WEPRB0;
      }
      暴露
      {
        位   =(地址/(8u * FLASH_MAIN_SECTOR_SIZE))% 32u;
        regOffset = VIMS_O_WEPRB1;
      }

      HWREG(VIMS_BASE + regOffset)&=~(1U <<位) ;
    }

    /*锁定密钥库区域。 PSA_CRrypto_init() 成功后调用。 */
    静态 void Flash_lockKeystoreRegion(void)
    {
      FlashProtectionSet(0xE6000U);
    }




    请注意、如果您向闪存的密钥库段添加写保护、并且函数尝试写入密钥库区域、则可能会由于引发错误而导致系统出现问题。 进行这种更改需要进行大量测试、以了解由于保护密钥库写入/擦除而可能发生的问题。 其系统必须处理这些错误、例如 PSA_ERROR_STORAGE_FAILURE 或 PSA_ERROR_GENERIC_ERROR。

    我建议实施安全代码实践、例如在调用函数时添加包装程序、以更改密钥(如导入/销毁函数)、从而添加额外的检查以确保仅影响所需的密钥。

    此致、
    Josh Alderson