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:请确认是否使用了 keystore PSA_importKey。

Guru**** 2526700 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1561390/cc2745r10-q1-please-confirm-the-use-of-keystore_psa_importkey

器件型号:CC2745R10-Q1


工具/软件:

我想使用 keystore _PSA_importKey、因此我们根据示例代码实现它并检查其运行情况。
我发现代码进入了 exception_handlerSpin 的无限循环。

我怀疑 PSA_import_key () 在内部用于 keystore PSA_importKey。
要检查 PSA_IMPORT_KEY () 的操作、
我创建了以下代码 ①、并使用与示例代码相同的参数检查了其操作。
然后、我们收到错误“PSA_ERROR_INVALID_PARAMUST"。“。
我还创建并运行了代码 ②、但返回了“PSA_ERROR_INSUFFICIENT_MEMOR"。“。

您能解释一下为什么这些错误代码是由 PSA_IMPORT_KEY () 报告的吗?
此外,当使用 keystore _PSA_importKey() 时,它会进入一个无限的 Exception_handlerSpin 循环。 是否有办法解决此问题?

--
① μ s
simplelink_lowpower_f3_SDK_9_10_00_83\source\ti\drivers\ECDSA.h
当我模拟示例代码运行以下源代码时、状态值为–135(传递给函数的参数无效。)
*当使用 keystorage_PSA_importKey 时, exception_handlerSpin 函数进入一个无限循环。

static uint8_t theirPublicKeyingMaterial[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};

static void vos_keystore_test( void )
{
    CryptoKey theirPublicKey;
    KeyStore_PSA_KeyFileId publicKeyID;
    KeyStore_PSA_KeyAttributes pubKeyAttributes = KEYSTORE_PSA_KEY_ATTRIBUTES_INIT;
    KeyStore_PSA_KeyType keyType = KEYSTORE_PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE;
    int_fast16_t status = KEYSTORE_PSA_STATUS_GENERIC_ERROR;
    // Public key
    KeyStore_PSA_setKeyAlgorithm(&pubKeyAttributes, KEYSTORE_PSA_ALG_ECDSA);
    KeyStore_PSA_setKeyUsageFlags(&pubKeyAttributes, KEYSTORE_PSA_KEY_USAGE_VERIFY_HASH);
    // Set key ID for persistent keys
    GET_KEY_ID(publicKeyID, KEYSTORE_PSA_KEY_ID_USER_MIN);
    KeyStore_PSA_setKeyLifetime(&pubKeyAttributes, KEYSTORE_PSA_KEY_LIFETIME_PERSISTENT);
    // In this example, we assume public key to be stored is for NIST-P256
    KeyStore_PSA_setKeyType(&pubKeyAttributes, keyType | KEYSTORE_PSA_ECC_CURVE_SECP256R1);
#if 0
    status = KeyStore_PSA_importKey(&pubKeyAttributes,
                                theirPublicKeyingMaterial,
                                sizeof(theirPublicKeyingMaterial),
                                &publicKeyID);
#else
    status = psa_import_key(&pubKeyAttributes,
                                theirPublicKeyingMaterial,
                                sizeof(theirPublicKeyingMaterial),
                                &publicKeyID);
#endif
    if (status != KEYSTORE_PSA_STATUS_SUCCESS)
    {
        while(1); // handle error
    }
    KeyStore_PSA_initKey(&theirPublicKey, publicKeyID, sizeof(theirPublicKeyingMaterial), NULL);
}

② μ s
simplelink_lowpower_f3_SDK_9_10_00_83\source\ti\drivers\cryptoutils\cryptokey\CryptoKeyKeyStore_PSA.h
当我模拟示例代码运行以下源代码时、状态值将为–141(没有足够的运行时内存)。
*当使用 keystorage_PSA_importKey 时, exception_handlerSpin 函数进入一个无限循环。

static uint8_t keyingMaterial[16] = {0x1f, 0x8e, 0x49, 0x73, 0x95, 0x3f, 0x3f, 0xb0,
                                      0xbd, 0x6b, 0x16, 0x66, 0x2e, 0x9a, 0x3c, 0x17};

static void vos_keystore_test( void )
{
    CryptoKey cryptoKey;
    KeyStore_PSA_KeyFileId keyID;
    int_fast16_t status;
    KeyStore_PSA_KeyAttributes attributes = KEYSTORE_PSA_KEY_ATTRIBUTES_INIT;
    // Assign key attributes
    KeyStore_PSA_setKeyUsageFlags(&attributes, (KEYSTORE_PSA_KEY_USAGE_DECRYPT | KEYSTORE_PSA_KEY_USAGE_ENCRYPT));
    KeyStore_PSA_setKeyAlgorithm(&attributes, KEYSTORE_PSA_ALG_CCM);
    KeyStore_PSA_setKeyType(&attributes, KEYSTORE_PSA_KEY_TYPE_AES);
    KeyStore_PSA_setKeyLifetime(&attributes, KEYSTORE_PSA_KEY_LIFETIME_PERSISTENT);
    // Set key ID
    GET_KEY_ID(keyID, KEYSTORE_PSA_KEY_ID_USER_MIN);
    KeyStore_PSA_setKeyId(&attributes, keyID);
    // Import the keyingMaterial
    
#if 0
    status = KeyStore_PSA_importKey(&attributes, 
                                    keyingMaterial, 
                                    sizeof(keyingMaterial), 
                                    &keyID);

#else    
    status = psa_import_key(&attributes, 
                            keyingMaterial, 
                            sizeof(keyingMaterial), 
                            &keyID);
#endif
    
    if (status != KEYSTORE_PSA_STATUS_SUCCESS)
    {
        while(1); // handle error
    }
    KeyStore_PSA_initKey(&cryptoKey, keyID, sizeof(keyingMaterial), NULL);
}

——

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

    您好:

    PSA 和密钥库 API 不应一起使用。 为了提高透明度、根本不应使用密钥库 API、所有密钥库操作都应通过 PSA API 进行。 在您所附的代码中、我看到了这些 API 的混合、因此我将重写代码以使用 PSA API。 您可以在中找到一些示例工程 /examples/rtos/LP_EM_CC2745R10_Q1/drivers 文件夹。 psaAeadEncrypt 是一个很好的使用示例。

    此外、您可以找到以下 AES-CBC 的示例、但可以推断为其他算法:

    /* 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>
    KEYSTORE_PSA_KEY_LIFETIME_PERSISTENT
    
    /* 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] = { 0x1f, 0x8e, 0x49, 0x73, 0x95, 0x3f, 0x3f, 0xb0,
                                   0xbd, 0x6b, 0x16, 0x66, 0x2e, 0x9a, 0x3c, 0x17
                                 };
    uint8_t iv[16] =                {0x2f, 0xe2, 0xb3, 0x33, 0xce, 0xda, 0x8f, 0x98,
                                     0xf4, 0xa9, 0x9b, 0x40, 0xd2, 0xcd, 0x34, 0xa8};
    
    uint8_t plaintext[16] =         {0x45, 0xcf, 0x12, 0x96, 0x4f, 0xc8, 0x24, 0xab,
                                     0x76, 0x61, 0x6a, 0xe2, 0xf4, 0xbf, 0x08, 0x22};
    
    uint8_t ciphertext[sizeof(plaintext)];
    
    /*
     *  ======== mainThread ========
     */
    void *mainThread(void *arg0)
    {
        psa_status_t status;
        psa_key_id_t key_id;
        int_fast16_t ret;
    
        status = psa_crypto_init();
        if (status != PSA_SUCCESS)
        {
            while(1);
        }
    
        ret = HSMLPF3_provisionHUK();
        if (ret != HSMLPF3_STATUS_SUCCESS)
        {
            while(1);
        }
    
    
        psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
    
        psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_ENCRYPT);
        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);
        }
    
        psa_cipher_operation_t op = PSA_CIPHER_OPERATION_INIT;
        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);
        }
    
        size_t cipher_length = 0;
    
        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);
        }
    
        while(1);
    }
    

    我会在空工程中运行此代码。 此外、确保已加载 HSM 固件。

    此致、

    Nima Behmanesh