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-AM64X:使用 HSM 构建 OPT Keywriter 应用

Guru**** 2482155 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1447510/processor-sdk-am64x-using-hsm-to-build-opt-keywriter-application

器件型号:PROCESSOR-SDK-AM64X

工具与软件:

你(们)好

我们将在基于 AM64X 的定制电路板上实现安全启动。 我们需要使用 HSM 来保持自定义密钥(SMPK、BMPK、SMEK、BMEK)的机密性。

我们认为我们可以通过为引导加载程序和内核签名来实现这一点。 但是、我们发现 Keywriter 应用的编译过程中存在基本缺陷。

为了解释这个缺陷、我们参照 https://software-dl.ti.com/tisci/esd/10_00_08/6_topic_user_guides/key_writer.html?highlight=fek#procedure 这里的图表。此图表明、SMEK 和 BMEK 密钥是使用临时 AES-256密钥进行 AES 加密的。

SMEK 和 BMEK 密钥用于 AES 加密引导加载程序和/或内核、请参见 https://software-dl.ti.com/tisci/esd/10_00_08/6_topic_user_guides/secure_boot_signing.html#signing-an-encrypted-binary-for-secure-boot、 因此必须保密。

为此、我们要将 SMEK 和 BMEK 密钥保留在 HSM 中。 但是、如果这样做、我们就无法再对密钥进行 AES 加密。 这是因为加密密钥需要从 HSM 中简单提取密钥、这是不可能(肯定是不可能的)的。 请注意、我们需要使用 PKCS#11 API 与 HSM 通信。 如果数据本身是位于 HSM 中的密钥、则此 API 不提供任何 AES 编码方法。

有什么想法如何解决此问题?

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

    您好!

    SMEK 或 BMEK 必须 以一种或另一种形式保留 HSM 、以便 Keywriter 将其刻录到电子保险丝中。 我只听说过 PKCS#11 HSM、但在互联网上快速搜索表明、提供了可提取对称密钥:

    https://python-pkcs11.readthedocs.io/en/latest/applied.html#aes-des

    此致、

    Prashant

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

    您好!

    使密钥可提取并不是真正的解决方案。 如果可提取密钥、我们不需要 HSM。

    显然、TI 调试过程需要密钥才能离开 HSM。 从我们的角度来看、这是一个安全问题。 这是一个很好的示例、说明复杂性如何导致安全性降低。 不使用 TI FEC-PUB 简单地对客户密钥进行编码有什么充分的理由吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为什么不使用 TI fec-pub 对客户密钥进行编码、有什么充分的理由?

    能否详细说明一下?

    我目前的理解是:

    在对称加密/解密方案中、两个实体(分别用于加密和解密的 HSM 和 ROM/TIFS)必须能够访问相同的对称密钥。 因此、对称密钥必须离开 HSM 依赖控制理论 并烧入电子保险丝。

    您是否建议密钥不能以简单(当然)或加密形式离开 HSM、而是以其他形式离开?

    谢谢!

    Prashant  

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

    我同意、对于 ROM/TIFS 而言、对称密钥必须已知、因此离开我们的 HSM。 但是、我认为这正是 TI 在将 SMEK/BMEK 密钥写入 X509扩展中之前对其进行加密的原因。

    重点是、此加密过程会强制我们从 HSM 中直接读取 SMEK/BMEK 密钥。 请看一下 gen_keywr_cert.sh 由 opt keywriter 提供的相同示例脚本。 特别是 gen_sym_key_x509_extension () 函数调用。

    gen_sym_key_x509_extension (){
       # gen_iv
       gen_iv "4美元"
       # gen_rs
       GEN_RS "5美元"
       IV =$(xxd -p -c 32 "4美元")
       类别"2美元""5美元">"6美元"
       OpenSSL dgst -SHA512 -二进制文件"2美元">"3美元"
       echo "1美元、$(xxd -p 3美元)">>"${output_info[hash_csv]}"
       OpenSSL AES-256-CBC -e -K "${aes256key_info[val]}"-iv "${IV}"-nopad -in "6美元"-out "7美元"
    }

    红色标记行中的2美元参数是指 SMEK 或 BMEK 密钥、显然必须从 HSM 中直接读取。

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

    您好!

    [报价 userid="440173" URL"~/support/processors-group/processors/f/processors-forum/1447510/processor-sdk-am64x-using-hsm-to-build-opt-keywriter-application/5553492 #5553492"]然而、我认为这正是 TI 在将 SMEK/BMEK 密钥写入 X509扩展之前对其进行加密的原因、对吗?

    这是对 SMEK/BMEK 密钥加密进行合理化的一个原因。

    但另一个原因是、如果不知道随机的 AES 密钥、就无法单独从证书中知道这些密钥。 由于此随机 AES 密钥本身使用 TIFIEK 公钥进行加密、因此 TIFS Keywriter 是唯一可以从证书对 SMEK/BMEK 加密密钥进行解密的实体、从而能够保持这些密钥的机密性。

    红色标记行中的2美元参数是指 SMEK 或 BMEK 密钥、显然必须从 HSM 中直接读取。

    当前的 Keywriter 是在假设本地文件系统中存在密钥的情况下设计的。 因此、它将负责读取这些密钥并对其进行加密以放入 X.509证书。

    对于任何定制设计、该功能可能会发生变化。 您可以对其进行修改、以便从 HSM 中以加密格式获取密钥、并将其保存到传递的输出文件("7美元"参数)中。 Keywriter 中的所有其他功能都不受影响。

    此致、

    Prashant

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于任何定制设计、该函数都可能发生变更。 您可以对其进行修改、以便从 HSM 中以加密格式获取密钥、并将其保存到传递的输出文件("7美元"参数)中。 Keywriter 中的所有其他内容都不受影响。

    我同意此功能可能会发生变化。 但是你如何修改这个函数呢? 我非常感谢您提出任何建议。 但恐怕这是不可能的。 到目前为止、我没有找到任何 PKCS#11命令序列、它涵盖了该函数所需的内容、同时将密钥保留在 HSM 中。

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

    您好!

    您能否简单介绍一下您当前 Keywriter 证书生成过程的架构?

    是否有本地主机正在执行 Keywriter 证书生成过程并与 PKCS#11接口交互、以从 HSM 获取任何必要的输出(如公钥哈希等)?

    是否可以只将 Keywriter 证书生成脚本移植到 HSM 中、让其运行到脚本并提供输出(证书)?

    谢谢!

    Prashant

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

    好的、我试着解释一下。 我们的目标架构如下所示:

    我们将有一个管理主机(紫色)连接到 HSM 的专用端口(蓝色)、所有关键管理任务都将在该端口执行。 这包括密钥生成。 请注意、奉献是由提升的访问权限定义的、不一定是由物理连接定义的。 CI/CD (绿色)和开发主机(绿色)通过网络连接到 HSM。 Keywriter 构建基础结构(因此也会生成证书)将部署到管理员主机(紫外)。

    我们构建 Keywriter 应用的目标过程如下:

    1)在 HSM 上:生成 RSA 密钥对(SMPK、BMPK)
    =>私钥不能离开 HSM
    2)在 HSM 上: 生成 AES 密钥(SMEK、BMEK)
    => AES 密钥不能离开 HSM
    3)在 HSM 上:生成临时 AES-256密钥。
     =>在这里,我们可以接受(临时)将 AES-256密钥存储在管理主机的文件系统中。 不过、我们认为这并没有真正起到改进的作用。
    4)在管理主机上:生成 Keywriter 应用程序

    在 Keywriter 应用程序编译期间、如上所述、管理员主机通过 PKCS#11与 HSM 进行交互。

    是否可以将 Keywriter 证书生成脚本移植到 HSM 中、让它运行到脚本并提供输出(证书)?

    我们不知道这是否可行。 我们需要一个 HSM 供应商来提供此功能。 我们在这样做时可能会失去标准遵守保证。 因此、我们会毫不犹豫地轻触 HSM。

    目前、我们可以考虑的唯一可行解决方案如下所示:

    1)在 HSM 上:生成 RSA 密钥对(SMPK、BMPK)
    2)在管理主机上:生成 AES 密钥(SMEK、BMEK)
    3)在管理主机上:生成临时 AES-256密钥
    4)在管理主机上:生成 Keywriter 应用程序
    5)在管理主机上:将 AES 密钥传输到 HSM
    6)在 HSM 上:使导入的密钥敏感(因此不能再离开 HSM)
    7)在管理主机上:删除所有 AES 密钥

    更多信息:
    由于 gen_keywr_cert.sh 脚本调用 gen_sym_key_x509_extension ()函数中的以下指令,我们目标过程中的步骤(4)无法实现(见上文):

    GEN_RS "5美元"
    类别"2美元""5美元">"6美元"
    OpenSSL AES-256-CBC -e -K "${aes256key_info[val]}"-iv "${IV}"-nopad -in "6美元"-out "7美元"

    5美元是一个32字节的随机数
    2美元是32字节的 SMEK/BMEK 密钥
    IV 是一个16字节的随机数

    从我们的角度来看,加密 SMEK/BMEK 密钥的 openssl 调用可能会被以下内容所取代:
    PKCS11-tool --module /usr/lib/softhsm/libsofthsm2.so -l -p --包装\
       - id --应用程序 ID - m AES-CBC --- iv ${IV}> 7美元

    此函数将绕回 (例如 SMEK) (例如 AES-256)都位于 HSM 上、并且输出 AES-CBC 加密结果。 我用柔柔声检查了一下。

    但是,附加在2美元的32字节随机数5美元 (猫"2美元""5美元">"6美元")让我们进入汤。 这会产生另一个64字节的值、它是有效加密的值。

    此 32字节附录的用途是什么? SMEK/BMEK 密钥已正确对齐、不需要填充、正确吗?

    此致

    Walter