Files
2026-06-06 20:50:54 +08:00

564 lines
22 KiB
C

/*
* Copyright (c) 2023, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*!****************************************************************************
* @file dl_keystorectl.h
* @brief KEYSTORECTL (Keystore Controller) Driver Library
* @defgroup KEYSTORECTL Keystore Controller (KEYSTORECTL)
*
* @anchor ti_dl_dl_keystorectl_Overview
* # Overview
*
* The Keystore Controller (KEYSTORECTL) DriverLib allows full configuration
* of the MSPM0 KEYSTORECTL Module.
*
* <hr>
******************************************************************************/
/** @addtogroup KEYSTORECTL
* @{
*/
#ifndef ti_dl_dl_keystorectl__include
#define ti_dl_dl_keystorectl__include
#include <stdbool.h>
#include <stdint.h>
#include <ti/devices/msp/msp.h>
#include <ti/driverlib/dl_common.h>
#ifdef __MSPM0_HAS_KEYSTORE_CTL__
#ifdef __cplusplus
extern "C" {
#endif
/* clang-format off */
/** @addtogroup DL_KEYSTORECTL_KEY_SLOT
* @{
*/
/*! @brief Keystore Controller Key Slot 0 */
#define DL_KEYSTORECTL_KEY_SLOT_0 (KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT0)
/*! @brief Keystore Controller Key Slot 1 */
#define DL_KEYSTORECTL_KEY_SLOT_1 (KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT1)
/*! @brief Keystore Controller Key Slot 2 */
#define DL_KEYSTORECTL_KEY_SLOT_2 (KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT2)
/*! @brief Keystore Controller Key Slot 3 */
#define DL_KEYSTORECTL_KEY_SLOT_3 (KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT3)
/*! @brief Keystore Controller Key Slot 4 */
#define DL_KEYSTORECTL_KEY_SLOT_4 (KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT4)
/*! @brief Keystore Controller Key Slot 5 */
#define DL_KEYSTORECTL_KEY_SLOT_5 (KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT5)
/*! @brief Keystore Controller Key Slot 6 */
#define DL_KEYSTORECTL_KEY_SLOT_6 (KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT6)
/*! @brief Keystore Controller Key Slot 7 */
#define DL_KEYSTORECTL_KEY_SLOT_7 (KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT7)
/*! @brief Keystore Controller Key Combined Slot 0 and 1 */
#define DL_KEYSTORECTL_KEY_SLOT_0_AND_1 ((KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT0) | \
(KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT1))
/*! @brief Keystore Controller Key Combined Slot 2 and 3 */
#define DL_KEYSTORECTL_KEY_SLOT_2_AND_3 ((KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT2) | \
(KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT3))
/*! @brief Keystore Controller Key Combined Slot 4 and 5 */
#define DL_KEYSTORECTL_KEY_SLOT_4_AND_5 ((KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT4) | \
(KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT5))
/*! @brief Keystore Controller Key Combined Slot 6 and 7 */
#define DL_KEYSTORECTL_KEY_SLOT_6_AND_7 ((KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT6) | \
(KEYSTORECTL_KEYWR_KEYSLOTSEL_SLOT7))
/** @}*/
/* clang-format on */
/*! @enum DL_KEYSTORECTL_NUM_256_KEYS */
typedef enum {
/*! No 256-bit keys */
DL_KEYSTORECTL_NUM_256_KEYS_ZERO = KEYSTORECTL_CFG_NK256_ZERO,
/*! One 256-bit keys */
DL_KEYSTORECTL_NUM_256_KEYS_ONE = KEYSTORECTL_CFG_NK256_ONE,
/*! Two 256-bit keys */
DL_KEYSTORECTL_NUM_256_KEYS_TWO = KEYSTORECTL_CFG_NK256_TWO,
/*! Three 256-bit keys */
DL_KEYSTORECTL_NUM_256_KEYS_THREE = KEYSTORECTL_CFG_NK256_THREE,
/*! Four 256-bit keys */
DL_KEYSTORECTL_NUM_256_KEYS_FOUR = KEYSTORECTL_CFG_NK256_FOUR,
} DL_KEYSTORECTL_NUM_256_KEYS;
/*! @enum DL_KEYSTORECTL_KEY_SIZE */
typedef enum {
/*! Key size set to 128 */
DL_KEYSTORECTL_KEY_SIZE_128_BITS = KEYSTORECTL_KEYWR_KEYSZSEL_K128,
/*! Key size set to 256 */
DL_KEYSTORECTL_KEY_SIZE_256_BITS = KEYSTORECTL_KEYWR_KEYSZSEL_K256,
} DL_KEYSTORECTL_KEY_SIZE;
/*! @enum DL_KEYSTORECTL_NUM_SLOTS */
typedef enum {
/*! Two 128-bit key slots present on device */
DL_KEYSTORECTL_NUM_SLOTS_TWO = KEYSTORECTL_STATUS_NKEYSLOTS_TWO,
/*! Three 128-bit key slots present on device */
DL_KEYSTORECTL_NUM_SLOTS_THREE = KEYSTORECTL_STATUS_NKEYSLOTS_THREE,
/*! Four 128-bit key slots present on device */
DL_KEYSTORECTL_NUM_SLOTS_FOUR = KEYSTORECTL_STATUS_NKEYSLOTS_FOUR,
} DL_KEYSTORECTL_NUM_SLOTS;
/*! @enum DL_KEYSTORECTL_CRYPTO_SEL */
typedef enum {
/*! Transfer the key from keystore KEYSTORECTL to the AES engine */
DL_KEYSTORECTL_CRYPTO_SEL_AES = KEYSTORECTL_KEYRD_CRYPTOSEL_AES,
} DL_KEYSTORECTL_CRYPTO_SEL;
/*! @enum DL_KEYSTORECTL_STATUS */
typedef enum {
/*! Valid status bit. Configuration is valid or operation completed. */
DL_KEYSTORECTL_STATUS_VALID = KEYSTORECTL_STATUS_STAT_VALID,
/*! No Configuration Status bit, no number of 256 keys has been identified.
* The user must call @ref DL_KEYSTORECTL_setNumberOf256Keys. */
DL_KEYSTORECTL_STATUS_NO_CONFIG = KEYSTORECTL_STATUS_STAT_NO_CFG,
/*! Invalid number set during @ref DL_KEYSTORECTL_setNumberOf256Keys */
DL_KEYSTORECTL_STATUS_INVALID_NUM_KEYS =
KEYSTORECTL_STATUS_STAT_INVALID_NK256,
/*! Busy RX status bit. The engine is busy receiving a key deposit. */
DL_KEYSTORECTL_STATUS_BUSY_RX = KEYSTORECTL_STATUS_STAT_BUSY_RECEIVE,
/*! Busy TX status bit. The engine is busy transmitting a key to a crypto engine */
DL_KEYSTORECTL_STATUS_BUSY_TX = KEYSTORECTL_STATUS_STAT_BUSY_TRANSMIT,
/*! Invalid key write configuration. This means one or more of the
* following: the selected slot exceeds available slots, the selected slot
* already contains a valid programmed key, the selected slot has a
* mismatched key size compared to the KEYSTORECTL configuration. */
DL_KEYSTORECTL_STATUS_INVALID_SLOT_WR =
KEYSTORECTL_STATUS_STAT_INVALID_KEYSLOTSELW,
/*! Invalid key read configuration (transmitting a key). This means one or
* more of the following: the selected slot exceeds available slots, the
* selected slot does not contain a valid programmed key, the selected slot
* has a mismatched key size */
DL_KEYSTORECTL_STATUS_INVALID_SLOT_RD =
KEYSTORECTL_STATUS_STAT_INVALID_KEYSLOTSELR,
/*! Key slots are not valid after a write. Write failed during the
@ref DL_KEYSTORECTL_writeKey (driver library specific). */
DL_KEYSTORECTL_STATUS_WRITE_FAILED = 0x0BAD,
} DL_KEYSTORECTL_STATUS;
/*!
* @brief Configuration struct for @ref DL_KEYSTORECTL_writeKey
*/
typedef struct {
/*! The key slot (or slots in the case of 256-bit keys) to be written.
* One of @ref DL_KEYSTORECTL_KEY_SLOT */
uint32_t keySlot;
/*! The size of the key (128-bit or 256-bit).
* One of @ref DL_KEYSTORECTL_KEY_SIZE */
DL_KEYSTORECTL_KEY_SIZE keySize;
/*! uint32_t pointer to the current key in memory */
uint32_t *key;
} DL_KEYSTORECTL_KeyWrConfig;
/*!
* @brief Configuration struct for @ref DL_KEYSTORECTL_transferKey
*/
typedef struct {
/*! The key slot (or slots in the case of 256-bit keys) to be transferred.
* One of @ref DL_KEYSTORECTL_KEY_SLOT */
uint32_t keySlot;
/*! The size of the key (128-bit or 256-bit).
* One of @ref DL_KEYSTORECTL_KEY_SIZE */
DL_KEYSTORECTL_KEY_SIZE keySize;
/*! The intended crypto recipient. One of @ref DL_KEYSTORECTL_CRYPTO_SEL */
DL_KEYSTORECTL_CRYPTO_SEL cryptoSel;
} DL_KEYSTORECTL_Config;
/**
* @brief Sets the number of combined 256 key slots
*
* For a given number of 128-bit key slots n, there can be up to n/2 slots
* combined to work as one 256-bit key slot. These larger slots are added to
* earlier slots first. Thus, a 4-slot device with one 256-key slot will have
* slots 0 and 1 combined, and slot 2 and 3 will remain 128-bit key slots.
* Refer to the device datasheet for the specific number of key slots.
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
* @param[in] numKeys Number of 256-bit keys, one of
* @ref DL_KEYSTORECTL_NUM_256_KEYS. Must be less than
* the total key slots on the device divided by two
*
* @note this function can only be written in a secure operating state before
* the INITDONE signal is asserted.
*/
__STATIC_INLINE void DL_KEYSTORECTL_setNumberOf256Keys(
KEYSTORECTL_Regs *keystorectl, DL_KEYSTORECTL_NUM_256_KEYS numKeys)
{
DL_Common_updateReg(
&keystorectl->CFG, (uint32_t) numKeys, KEYSTORECTL_CFG_NK256_MASK);
}
/**
* @brief Returns the current number of combined 256 key slots
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
*
* @return number of 256-bit keys. One of @ref DL_KEYSTORECTL_NUM_256_KEYS
*
* @sa DL_KEYSTORECTL_setNumberOf256Keys
*/
__STATIC_INLINE DL_KEYSTORECTL_NUM_256_KEYS DL_KEYSTORECTL_getNumberOf256Keys(
const KEYSTORECTL_Regs *keystorectl)
{
uint32_t numKeys = (keystorectl->CFG & KEYSTORECTL_CFG_NK256_MASK);
return (DL_KEYSTORECTL_NUM_256_KEYS)(numKeys);
}
/**
* @brief Sets the intended destination key slot for the next write
*
* Sets the destination key slot for a data write to that region. In the case
* of 128-bit key slot, only one slot should be selected. In the case of a 256-
* bit key slot, both registers should be selected and the key size should also
* reflect this change. If 256- it keys are desired, they should be configured
* using @ref DL_KEYSTORECTL_NUM_256_KEYS.
* Refer to the device datasheet for the specific number of key slots.
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
* @param[in] keySlot The intended key slot. Can be 128-bit or a 256-bit.
* One of @ref DL_KEYSTORECTL_KEY_SLOT
*
* @note this function can only be written in a secure operating state before
* the INITDONE signal is asserted.
*
* @sa DL_KEYSTORECTL_setNumberOf256Keys
* @sa DL_KEYSTORECTL_setDestinationKeySize
*/
__STATIC_INLINE void DL_KEYSTORECTL_setDestinationKeySlot(
KEYSTORECTL_Regs *keystorectl, uint32_t keySlot)
{
DL_Common_updateReg(
&keystorectl->KEYWR, keySlot, KEYSTORECTL_KEYWR_KEYSLOTSEL_MASK);
}
/**
* @brief Returns the intended destination key slot for the next write
*
* Refer to the device datasheet for the specific number of key slots.
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
*
* @returns The intended key slot. Can be 128-bit or a 256-bit. One of
* @ref DL_KEYSTORECTL_KEY_SLOT
*
* @note this function can only be read in a secure operating state before
* the INITDONE signal is asserted.
*
* @sa DL_KEYSTORECTL_setDestinationKeySlot
*/
__STATIC_INLINE uint32_t DL_KEYSTORECTL_getDestinationKeySlot(
const KEYSTORECTL_Regs *keystorectl)
{
return (keystorectl->KEYWR & KEYSTORECTL_KEYWR_KEYSLOTSEL_MASK);
}
/**
* @brief Sets the intended destination key slot size for next write
*
* Sets the destination key slot size for a data write to that region. If 256-
* bit keys are desired, they should be configured using
* @ref DL_KEYSTORECTL_NUM_256_KEYS.
* Refer to the device datasheet for the specific number of key slots.
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
* @param[in] keySize The intended key size. One of
* @ref DL_KEYSTORECTL_KEY_SIZE
*
* @note this function can only be written in a secure operating state before
* the INITDONE signal is asserted.
*
* @sa DL_KEYSTORECTL_setNumberOf256Keys
* @sa DL_KEYSTORECTL_setDestinationKeySlot
*/
__STATIC_INLINE void DL_KEYSTORECTL_setDestinationKeySize(
KEYSTORECTL_Regs *keystorectl, DL_KEYSTORECTL_KEY_SIZE keySize)
{
DL_Common_updateReg(&keystorectl->KEYWR, (uint32_t) keySize,
KEYSTORECTL_KEYWR_KEYSZSEL_MASK);
}
/**
* @brief Returns the intended destination key size for the next write
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
*
* @returns The intended key size. One of @ref DL_KEYSTORECTL_KEY_SIZE
*
* @note this function can only be read in a secure operating state before
* the INITDONE signal is asserted.
*
* @sa DL_KEYSTORECTL_setDestinationKeySize
*/
__STATIC_INLINE DL_KEYSTORECTL_KEY_SIZE DL_KEYSTORECTL_getDestinationKeySize(
const KEYSTORECTL_Regs *keystorectl)
{
uint32_t keySize = (keystorectl->KEYWR & KEYSTORECTL_KEYWR_KEYSZSEL_MASK);
return (DL_KEYSTORECTL_KEY_SIZE)(keySize);
}
/**
* @brief Sets the intended destination key slot size for next write
*
* Loads a key of the provided size into the KEYSTORECTL provided there is a
* valid bit set. The specific intended slot and size should already be set by
* the user before using this.
* Refer to the device datasheet for the specific number of key slots.
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
* @param[in] key Pointer to an uint32_t array containing the key.
*
* @note this function can only be written in a secure operating state before
* the INITDONE signal is asserted.
*
* @sa DL_KEYSTORECTL_setDestinationKeySlot
* @sa DL_KEYSTORECTL_setDestinationKeySize
*/
void DL_KEYSTORECTL_loadKey(KEYSTORECTL_Regs *keystorectl, uint32_t *key);
/**
* @brief Gets the intended source key slot for the next transfer
*
* Sets the source key slot for a data transfer to another crypto peripheral.
* In the case of 128-bit key slot, only one slot should be selected. In the
* case of a 256-bit key slot, both registers should be selected and the key
* size should also reflect this change. If 256- it keys are desired, they
* can be accessed using @ref DL_KEYSTORECTL_getNumberOf256Keys.
* Refer to the device datasheet for the specific number of key slots.
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
* @param[in] keySlot The intended key slot. Can be 128-bit or a 256-bit.
* One of @ref DL_KEYSTORECTL_KEY_SLOT
*
* @sa DL_KEYSTORECTL_getNumOf256Keys
* @sa DL_KEYSTORECTL_setSourceKeySize
*/
__STATIC_INLINE void DL_KEYSTORECTL_setSourceKeySlot(
KEYSTORECTL_Regs *keystorectl, uint32_t keySlot)
{
DL_Common_updateReg(
&keystorectl->KEYRD, keySlot, KEYSTORECTL_KEYRD_KEYSLOTSEL_MASK);
}
/**
* @brief Gets the intended source key slot for the next transfer
*
* Refer to the device datasheet for the specific number of key slots.
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
*
* @returns The intended key slot. Can be 128-bit or a 256-bit. One of
* @ref DL_KEYSTORECTL_KEY_SLOT
*
* @sa DL_KEYSTORECTL_setSourceKeySlot
*/
__STATIC_INLINE uint32_t DL_KEYSTORECTL_getSourceKeySlot(
const KEYSTORECTL_Regs *keystorectl)
{
return (keystorectl->KEYRD & KEYSTORECTL_KEYRD_KEYSLOTSEL_MASK);
}
/**
* @brief Gets the intended source key slot size for next transfer
*
* Sets the source key slot size for a data transfer to that region. If 256-
* bit keys are desired, they should be configured using
* @ref DL_KEYSTORECTL_NUM_256_KEYS.
* Refer to the device datasheet for the specific number of key slots.
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
* @param[in] keySize The intended key size. One of
* @ref DL_KEYSTORECTL_KEY_SIZE
*
* @sa DL_KEYSTORECTL_setNumberOf256Keys
* @sa DL_KEYSTORECTL_setSourceKeySlot
*/
__STATIC_INLINE void DL_KEYSTORECTL_setSourceKeySize(
KEYSTORECTL_Regs *keystorectl, DL_KEYSTORECTL_KEY_SIZE keySize)
{
DL_Common_updateReg(&keystorectl->KEYRD, (uint32_t) keySize,
KEYSTORECTL_KEYRD_KEYSZSEL_MASK);
}
/**
* @brief Gets the intended source key size for the next transfer
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
*
* @returns The intended key size. One of @ref DL_KEYSTORECTL_KEY_SIZE
*
* @sa DL_KEYSTORECTL_setSourceKeySize
*/
__STATIC_INLINE DL_KEYSTORECTL_KEY_SIZE DL_KEYSTORECTL_getSourceKeySize(
const KEYSTORECTL_Regs *keystorectl)
{
uint32_t keySize = (keystorectl->KEYRD & KEYSTORECTL_KEYRD_KEYSZSEL_MASK);
return (DL_KEYSTORECTL_KEY_SIZE)(keySize);
}
/**
* @brief Gets the current status of the KEYSTORECTL module
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
*
* @return The status of the keystorectl. One of @ref DL_KEYSTORECTL_STATUS
*/
__STATIC_INLINE DL_KEYSTORECTL_STATUS DL_KEYSTORECTL_getStatus(
const KEYSTORECTL_Regs *keystorectl)
{
uint32_t status = (keystorectl->STATUS & KEYSTORECTL_STATUS_STAT_MASK);
return (DL_KEYSTORECTL_STATUS)(status);
}
/**
* @brief Gets currently written key slots
*
* To understand the key slot configuration, consider the configuration of the
* keys including the number of 256-bit keys, and the number of available key
* slots
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
*
* @return Bitwise OR of all valid slots, corresponding to
* @ref DL_KEYSTORECTL_KEY_SLOT values.
*/
__STATIC_INLINE uint32_t DL_KEYSTORECTL_getValidKeySlots(
const KEYSTORECTL_Regs *keystorectl)
{
return (keystorectl->STATUS & KEYSTORECTL_STATUS_VALID_MASK);
}
/**
* @brief Gets the total number of 128-bit key slots in HW on the device
*
* This is the number of key slots that the KEYSTORECTL module has in HW on the
* device. It does not reflect the configuration or the number of 256-bit keys,
* only the total number of slots. This also governs the valid configurations,
* and the number of 256-bit keys must be less than or equal to half the value.
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
*
* @return The number of 128-bit slots on the device. One of
* @ref DL_KEYSTORECTL_NUM_SLOTS
*/
__STATIC_INLINE DL_KEYSTORECTL_NUM_SLOTS DL_KEYSTORECTL_getNumSlots(
const KEYSTORECTL_Regs *keystorectl)
{
uint32_t numSlots =
(keystorectl->STATUS & KEYSTORECTL_STATUS_NKEYSLOTS_MASK);
return (DL_KEYSTORECTL_NUM_SLOTS)(numSlots);
}
/**
* @brief Writes a key into the KEYSTORE
*
* The sequence this function will follow:
*
* 1. Confirm valid status on the KEYSTORECTL
* 2. Configure the key write by writing size and slot to the key that is to be
* written. Passed in via @ref DL_KEYSTORECTL_KeyWrConfig
* 3. Confirm a valid write configuration
* 4. Write key to the input buffer
* 5. Loop until status is back to valid
* 6. Confirm key slots are successfully written
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
*
* @param[in] keyWrConfig Pointer to the write key configuration struct
* @ref DL_KEYSTORECTL_KeyWrConfig
*
* @return Status of the operation of type @ref DL_KEYSTORECTL_STATUS. Type
* will be DL_KEYSTORECTL_STATUS_VALID if successful, or return the
* error status.
*
* @note The function @ref DL_KEYSTORECTL_setNumberOf256Keys must be run
* before this can be executed.
* @note It is not possible to overwrite a previously configured key. A full
* BOOTRST must be executed before the KEYSTORECTL is erased and can be
* re-initialized and written.
* @note this function can only be written in a secure operating state before
* the INITDONE signal is asserted.
*/
DL_KEYSTORECTL_STATUS DL_KEYSTORECTL_writeKey(
KEYSTORECTL_Regs *keystorectl, DL_KEYSTORECTL_KeyWrConfig *keyWrConfig);
/**
* @brief Transfers key loaded in KEYSTORE into intended crypto
*
* Combination of previous functions in order to give the entire operation.
* Expected runtime sequence:
*
* 1. Confirm valid status on the KEYSTORECTL
* 2. Configure the read transfer by writing size, slot, and recipient
* This is passed in via the struct @ref DL_KEYSTORECTL_Config
* 3. Confirm a valid status and transfer configuration of the KEYSTORECTL
* 4. Loop until status is back to valid
*
* @param[in] keystorectl Pointer to the register overlay for the peripheral
* @param[in] config Pointer to a filled out config struct of type
* @ref DL_KEYSTORECTL_Config
*
* @return Status of the operation of type @ref DL_KEYSTORECTL_STATUS. Type
* will be DL_KEYSTORECTL_STATUS_VALID if successful, or return the
* error status.
*/
DL_KEYSTORECTL_STATUS DL_KEYSTORECTL_transferKey(
KEYSTORECTL_Regs *keystorectl, const DL_KEYSTORECTL_Config *config);
#ifdef __cplusplus
}
#endif
#endif /* __MSPM0_HAS_KEYSTORE_CTL__ */
#endif /* ti_dl_dl_KEYSTORECTL__include */
/** @}*/