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:关于双重用途密钥

Guru**** 2652475 points

Other Parts Discussed in Thread: CC2745R10-Q1

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1569786/cc2745r10-q1-about-dual-use-keys

器件型号:CC2745R10-Q1


工具/软件:

您好:

我的环境如下:
板:CC2745R10-Q1
调试器:XDS110
SDK:SimpleLink Lowpower f3 ver.9.10.00.83
IDE:IAR Embedded Workbench for ARM 9.60.3.7274

由于密钥库中可存储的密钥数量有限、
相同的密钥即可实现多种功能。
这是可能的吗? 如果是、请告诉我如何操作。

在下面的测试代码中、
导入密钥时未指定算法:
PSA_set_key_algorithm (&attributes、PSA_ALG_none);

我只想在使用时指定算法、
PSA_RAW_KEY_Agreement (PSA_ALG_ECDH、KEY_ID、‥
PSA_SIGN_HASH (KEY_ID、PSA_ALG_ECDSA (PSA_ALG_SHA_256)、‥μ s

这不起作用 (PSA_IMPORT_KEY 返回的错误代码–135)。

static void vos_store_test( void )
{
    uint8_t myPrivateKey[32] =   {0x96, 0xBF, 0x85, 0x49, 0xC3, 0x79, 0xE4, 0x04,
                                  0xED, 0xA1, 0x08, 0xA5, 0x51, 0xF8, 0x36, 0x23,
                                  0x12, 0xD8, 0xD1, 0xB2, 0xA5, 0xFA, 0x57, 0x06,
                                  0xE2, 0xCC, 0x22, 0x5C, 0xF6, 0xF9, 0x77, 0xC4};
    uint8_t messageHash[32] =    {0xA4, 0x1A, 0x41, 0xA1, 0x2A, 0x79, 0x95, 0x48,
                                  0x21, 0x1C, 0x41, 0x0C, 0x65, 0xD8, 0x13, 0x3A,
                                  0xFD, 0xE3, 0x4D, 0x28, 0xBD, 0xD5, 0x42, 0xE4,
                                  0xB6, 0x80, 0xCF, 0x28, 0x99, 0xC8, 0xA8, 0xC4};
    uint8_t theirPublicKey[65] = {0x04,
                                  // X
                                  0xB7, 0xE0, 0x8A, 0xFD, 0xFE, 0x94, 0xBA, 0xD3,
                                  0xF1, 0xDC, 0x8C, 0x73, 0x47, 0x98, 0xBA, 0x1C,
                                  0x62, 0xB3, 0xA0, 0xAD, 0x1E, 0x9E, 0xA2, 0xA3,
                                  0x82, 0x01, 0xCD, 0x08, 0x89, 0xBC, 0x7A, 0x19,
                                  //Y
                                  0x36, 0x03, 0xF7, 0x47, 0x95, 0x9D, 0xBF, 0x7A,
                                  0x4B, 0xB2, 0x26, 0xE4, 0x19, 0x28, 0x72, 0x90,
                                  0x63, 0xAD, 0xC7, 0xAE, 0x43, 0x52, 0x9E, 0x61,
                                  0xB5, 0x63, 0xBB, 0xC6, 0x06, 0xCC, 0x5E, 0x09};

    int_fast16_t s2t_status;
    uint8_t u1t_Out[100] = {0};
    size_t output_len = 0;

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

    s2t_status = HSMLPF3_provisionHUK();
    if (s2t_status != HSMLPF3_STATUS_SUCCESS)
    {
        while(1);
    }
    
    psa_key_id_t key_id = PSA_KEY_ID_USER_MIN;
    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
    psa_set_key_type(&attributes, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
    psa_set_key_usage_flags(&attributes, (PSA_KEY_USAGE_DERIVE | PSA_KEY_USAGE_SIGN_HASH));
    psa_set_key_algorithm(&attributes, PSA_ALG_NONE);
    psa_set_key_lifetime(&attributes, PSA_KEY_LIFETIME_PERSISTENT);
    psa_set_key_bits(&attributes, 256);
    /* Import the keyingMaterial */
    s2t_status = psa_import_key(&attributes, myPrivateKey, sizeof(myPrivateKey), &key_id);
    if(s2t_status != PSA_SUCCESS)
    {
        while(1);
    }

    s2t_status = psa_raw_key_agreement(PSA_ALG_ECDH,
                                       key_id,
                                       theirPublicKey,
                                       sizeof(theirPublicKey),
                                       u1t_Out,
                                       sizeof(u1t_Out),
                                       &output_len);
    if(s2t_status != PSA_SUCCESS)
    {
        while(1);
    }

    s2t_status = psa_sign_hash(key_id,
                               PSA_ALG_ECDSA(PSA_ALG_SHA_256),
                               messageHash,
                               sizeof(messageHash),
                               u1t_Out,
                               sizeof(u1t_Out),
                               &output_len);
    if(s2t_status != PSA_SUCCESS)
    {
        while(1);
    }
}

此致、

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

    您好:

    我对这里的密钥库有点新! 但我应该能够提供一些有关此方面的文档:

    加密密钥材料可通过多种方式存储在嵌入式系统上。

    • 明文:在闪存或 RAM 中为明文
    • 密钥存储区:在专用硬件数据库中、无法直接读取其条目。

    在执行加密操作时、每个存储选项都需要不同的方法来处理密钥材料。 为了将这些问题与 TI-RTOS 提供的各种加密驱动程序的 API 分开、 CryptoKey  类型将从这些详细信息中提取出来。 它不包含任何加密密钥材料本身、而是包含驱动程序使用密钥材料所需的详细信息。 驱动程序实现负责根据需要准备和移动密钥材料以执行所需的加密操作。

    同一 加密密钥 可以传递给不同模式的加密 API、具体取决于其存储类型对密钥的限制。 加载密钥材料时、明文密钥可以无限制地使用、而密钥存储区密钥的允许使用受到限制。 这些限制在特定于器件的加密 Key_Security 策略中指定、具体取决于器件的硬件功能。

    此外、SDK (9.12 F3 SDK) 中的 psaRawKeyAgreement 示例有一个示例、展示了如何存储/使用某些密钥。  

    我正在考虑将同一个密钥用于多个函数。

    当我之前使用 AES 加密进行测试时,我能够在不同明文上重新使用密钥。

    谢谢、
    Alex F

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

    您好:

    我可以导入密钥两次 (ECDH、ECDSA)、并使用 PSA_RAW_KEY_AGRECT 和 PSA_SIGN_HASH、
    但我正在寻找一种导入密钥一次的方法、并同时使用 PSA_RAW_KEY_AGRECT 和 PSA_SIGN_HASH。

    这是可能的吗? 如果是、请告诉我如何操作。

    此致、

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

    您好:

    所以我不会误解您的问题、您想调用 PSA_IMPORT_KEY (...) 一次、然后将其用于 ECDH 和 ECDSA? 或者您目前正在使用其他功能。  

    谢谢、
    Alex F

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

    是的、我想调用 PSA_IMPORT_KEY (...) 一次、然后将其用于 ECDH 和 ECDSA?
    这是可能的吗? 如果是、请告诉我如何操作。

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

    您好:

    在进一步研究之后、如果我们专门使用 PSA_IMPORT_KEY (...) 函数我们无法重新使用密钥/调用。 原因是 PSA_IMPORT_KEY 函数调用每个 ECDH 和 ECDSA 都有自己特定属性的 PSA_KEY_ATTRIBUTES;因此、一旦我们为 ECDH 或 ECDSA 调用 PSA_IMPORT_KEY、我们就无法将其用于其他算法。  

    我可以导入密钥两次 (ECDH、ECDSA)、并使用 PSA_RAW_KEY_AGRECT 和 PSA_SIGN_HASH

    这是使用 PSA_IMPORT_KEY (...) 的正确路径 测量输出。  

    谢谢、
    Alex F