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**** 2322990 points
Other Parts Discussed in Thread: SHA-256
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1502248/cc2745r10-q1-about-psa-keystore-import-and-export

器件型号:CC2745R10-Q1
主题中讨论的其他部件:SHA-256

工具/软件:

相关问题

CC2745R10-Q1:使用 PSA 密钥库进行加密操作- Bluetooth 论坛- BluetoothRegistered︎- TI E2E 支持论坛

你好。

此问题与 Kaichi 提出的查询有关。

我修改了 NIMA 提供的源代码如下。

导入的密钥随后导出时、导出的密钥exported_key()和导入的密钥()keyingMaterial是相同的。

/* For usleep() */
#include <unistd.h>
#include <stdint.h>
#include <stddef.h>

/* Driver Header files */
#include <ti/drivers/GPIO.h>
#include <third_party/psa_crypto/include/psa/crypto.h>
#include <ti/drivers/cryptoutils/hsm/HSMLPF3.h>

/* Driver configuration */
#include "ti_drivers_config.h"

#define KEY_LIFETIME PSA_KEY_LIFETIME_FROM_PERSISTENCE_AND_LOCATION(PSA_KEY_PERSISTENCE_DEFAULT, PSA_KEY_LOCATION_LOCAL_STORAGE)

uint8_t keyingMaterial[16] = { 0x06, 0xa9, 0x21, 0x40, 0x36, 0xb8, 0xa1, 0x5b, 0x51, 0x2e, 0x03, 0xd5, 0x34, 0x12, 0x00, 0x06 };
uint8_t iv[16] = { 0x3d, 0xaf, 0xba, 0x42, 0x9d, 0x9e, 0xb4, 0x30, 0xb4, 0x22, 0xda, 0x80, 0x2c, 0x9f, 0xac, 0x41 };
uint8_t plaintext[16] = { 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6d, 0x73, 0x67 };
uint8_t ciphertext[16];
uint8_t exported_key[sizeof(keyingMaterial)];

//ciphertest { 0xe3, 0x53, 0x77, 0x9c, 0x10, 0x79, 0xae, 0xb8, 0x27, 0x08, 0x94, 0x2d, 0xbe, 0x77, 0x18, 0x1a };


/*
 *  ======== mainThread ========
 */
void *mainThread(void *arg0)
{
    psa_status_t status;
    psa_key_id_t key_id;
    size_t exported_key_length;
    psa_cipher_operation_t op = PSA_CIPHER_OPERATION_INIT;
    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
    size_t cipher_length = 0;
    int_fast16_t ret;

    status = psa_crypto_init();
    if (status != PSA_SUCCESS)
    {
        while(1);
    }

    ret = HSMLPF3_provisionHUK();
    if (ret != HSMLPF3_STATUS_SUCCESS)
    {
        while(1);
    }


    /* Import Key*/
    psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_EXPORT|PSA_KEY_USAGE_ENCRYPT|PSA_KEY_USAGE_DECRYPT);
    psa_set_key_algorithm(&attributes, PSA_ALG_CBC_NO_PADDING);
    psa_set_key_type(&attributes, PSA_KEY_TYPE_AES);
    psa_set_key_lifetime(&attributes, KEY_LIFETIME);
    psa_set_key_bits(&attributes, 128);

    key_id = PSA_KEY_ID_USER_MIN;
    psa_set_key_id(&attributes, key_id);

    status = psa_import_key(&attributes, keyingMaterial, sizeof(keyingMaterial), &key_id);
    if (status != PSA_SUCCESS)
    {
        while(1);
    }

    /* AES-CBC Encrypt */
    status = psa_cipher_encrypt_setup(&op, key_id, PSA_ALG_CBC_NO_PADDING);
    if (status != PSA_SUCCESS)
    {
        while(1);
    }

    status = psa_cipher_set_iv(&op, iv, sizeof(iv));
    if (status != PSA_SUCCESS)
    {
        while(1);
    }

    status = psa_cipher_update(&op,
                               plaintext,
                               sizeof(plaintext),
                               ciphertext,
                               sizeof(plaintext),
                               &cipher_length);

    if (status != PSA_SUCCESS)
    {
        while(1);
    }

    status = psa_cipher_finish(&op,
                               ciphertext,
                               sizeof(plaintext),
                               &cipher_length);
    if (status != PSA_SUCCESS)
    {
        while(1);
    }


    /* Export Key*/
    status = psa_export_key(key_id, exported_key, sizeof(exported_key), &exported_key_length);

    if (status != PSA_SUCCESS)
    {
         while(1);
    }


    while(1);
}

由于可存储的密钥数量有限、我考虑暂时导出密钥进行保存、并在需要时重新导入。

因此、出于安全考虑、最好对导出的密钥进行加密。

是否可以导出加密密钥?

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

    您好:

    可以、您可以导出加密密钥材料。 我需要联系团队、了解如何正确完成此操作、明天会联系您。

    此致、

    Nima Behmanesh

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

    您好:

    与团队交谈后、用于导出包装密钥的功能应包含在下一个 SDK 中、我认为该 SDK 将在5月初推出。 同时、我将提供一些在 SDK 发布后应该可以正常工作的代码。 我明天将提供此代码。

    此致、

    Nima Behmanesh

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

    谢谢你。

    5月初发布的新 SDK 是否支持加密操作列表?

    我们需要支持以下加密操作:

    真随机数生成
    AES-128-ECB
    AES-128-CBC
    AES-128-CMAC
    AES-128-GCM
    AES-128-CCM
    AES-128-AES CTR
    HKDF-Extract-SHA256
    HKDF-EXPANSION-SHA256
    SHA-256
    密钥生成 P-256
    ECDH P-256
    ECDSA-SHA256-P256签名生成和验证

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

    您好:

    现在应该支持这些算法。 在下一个版本之前不支持的唯一功能是导出打包的密钥。

    此致、

    Nima Behmanesh

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

    感谢您提供的信息。

    我的团队担心不支持目标加密操作、如以下 SDK 文档所述。

    /simplelink_lowpower_f3_SDK_8_40_02_01/docs/proprietary-rf/proprietary-rf-users-guide/cc23xx/psa-to-sl-cc23xx.html

    这与 CC27有关吗?

    我们找不到有关 PSA 支持的任何其他信息。

    如果它受 CC27支持、如果您可以添加该文档、将会很有帮助。

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

    您好:

    是的、该文档将在下一个 SDK 版本中进行更新。 将会显示支持算法的更新列表。 SDK 发布后、我会通知您!

    此致、

    Nima Behmanesh

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

    谢谢你。

    您还能告诉我出口加密密钥材料的正确使用情况吗?

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

    您好:

    当需要将密钥存储在不安全闪存存储中时、通常需要导出加密密钥。 如果以某种方式读出密钥、因为密钥是加密的、就没有用处。  

    使用密钥时、HSM 将 展开(解密) 密钥、对密钥进行任何操作、然后  在密钥发送回用户存储之前再次绕回(加密)。  

    总之、正确使用加密密钥材料是为了将密钥安全地存储在闪存中。

    此致、

    Nima Behmanesh

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

    谢谢你。
    如果您有新 SDK 的具体代码示例、可以将其发送给我吗?
    我想创建一个映像来实现。

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

    您好:

    您的代码只需要一次更改、这是密钥寿命。

    psa_set_key_lifetime(&attributes,
                             PSA_KEY_LIFETIME_FROM_PERSISTENCE_AND_LOCATION(
                                     PSA_KEY_PERSISTENCE_DEFAULT,
                                     PSA_KEY_LOCATION_HSM_ASSET_STORE)
                                     );

    在提供的代码中、设置密钥寿命、以便将密钥存储在密钥库 NV 中而不被打包。 上述密钥生命周期将确保 HSM 打包密钥、以及密钥导出时间将被加密。

    如果您在新 SDK 之前尝试此方法、它将会失败、但一旦新 SDK 关闭、它应该可以正常工作。

    此致、

    Nima Behmanesh

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

    我能够了解加密密钥生命周期的配置。
    我会在发布新 SDK 时对其进行检查。
    非常感谢。