#include "common.h"
#if defined(MBEDTLS_PSA_CRYPTO_C)
#include "psa/crypto.h"
#include "psa_crypto_core.h"
#include "psa_crypto_driver_wrappers_no_static.h"
#include "psa_crypto_slot_management.h"
#include "psa_crypto_storage.h"
#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
#include "psa_crypto_se.h"
#endif
#include <stdlib.h>
#include <string.h>
#include "mbedtls/platform.h"
#if defined(MBEDTLS_THREADING_C)
#include "mbedtls/threading.h"
#endif
MBEDTLS_STATIC_ASSERT(…);
MBEDTLS_STATIC_ASSERT(…);
MBEDTLS_STATIC_ASSERT(…);
MBEDTLS_STATIC_ASSERT(…);
MBEDTLS_STATIC_ASSERT(…);
MBEDTLS_STATIC_ASSERT(…);
MBEDTLS_STATIC_ASSERT(…);
MBEDTLS_STATIC_ASSERT(…);
#if defined(MBEDTLS_PSA_KEY_STORE_DYNAMIC)
#define PERSISTENT_KEY_CACHE_COUNT …
#define KEY_ID_SLOT_INDEX_WIDTH …
#define KEY_ID_SLICE_INDEX_WIDTH …
#define KEY_SLOT_VOLATILE_SLICE_BASE_LENGTH …
#define KEY_SLOT_VOLATILE_SLICE_COUNT …
#define KEY_SLICE_COUNT …
#define KEY_SLOT_CACHE_SLICE_INDEX …
#if (KEY_SLOT_VOLATILE_SLICE_BASE_LENGTH > \
SIZE_MAX >> (KEY_SLOT_VOLATILE_SLICE_COUNT - 1))
#error "Maximum slice length overflows size_t"
#endif
#if KEY_ID_SLICE_INDEX_WIDTH + KEY_ID_SLOT_INDEX_WIDTH > 30
#error "Not enough room in volatile key IDs for slice index and slot index"
#endif
#if KEY_SLOT_VOLATILE_SLICE_COUNT > (1 << KEY_ID_SLICE_INDEX_WIDTH)
#error "Too many slices to fit the slice index in a volatile key ID"
#endif
#define KEY_SLICE_LENGTH_MAX …
#if KEY_SLICE_LENGTH_MAX > 1 << KEY_ID_SLOT_INDEX_WIDTH
#error "Not enough room in volatile key IDs for a slot index in the largest slice"
#endif
#if KEY_ID_SLICE_INDEX_WIDTH > 8
#error "Slice index does not fit in uint8_t for psa_key_slot_t::slice_index"
#endif
static psa_key_id_t volatile_key_id_of_index(size_t slice_idx,
size_t slot_idx)
{ … }
static size_t slice_index_of_volatile_key_id(psa_key_id_t key_id)
{ … }
static size_t slot_index_of_volatile_key_id(psa_key_id_t key_id)
{ … }
#define FREE_SLOT_INDEX_NONE …
#if defined(MBEDTLS_TEST_HOOKS)
size_t psa_key_slot_volatile_slice_count(void)
{
return KEY_SLOT_VOLATILE_SLICE_COUNT;
}
#endif
#else
#define PERSISTENT_KEY_CACHE_COUNT …
#define KEY_SLICE_COUNT …
#define KEY_SLOT_CACHE_SLICE_INDEX …
#endif
psa_global_data_t;
static psa_global_data_t global_data;
static uint8_t psa_get_key_slots_initialized(void)
{ … }
static inline size_t key_slice_length(size_t slice_idx);
static inline psa_key_slot_t *get_volatile_key_slot(psa_key_id_t key_id);
static inline psa_key_slot_t *get_persistent_key_slot(size_t slot_idx);
static inline psa_key_slot_t *get_key_slot(size_t slice_idx, size_t slot_idx);
#if defined(MBEDTLS_PSA_KEY_STORE_DYNAMIC)
#if defined(MBEDTLS_TEST_HOOKS)
size_t (*mbedtls_test_hook_psa_volatile_key_slice_length)(size_t slice_idx) = NULL;
#endif
static inline size_t key_slice_length(size_t slice_idx)
{ … }
static inline psa_key_slot_t *get_volatile_key_slot(psa_key_id_t key_id)
{ … }
static inline psa_key_slot_t *get_persistent_key_slot(size_t slot_idx)
{ … }
static inline psa_key_slot_t *get_key_slot(size_t slice_idx, size_t slot_idx)
{ … }
#else
static inline size_t key_slice_length(size_t slice_idx)
{
(void) slice_idx;
return ARRAY_LENGTH(global_data.key_slots);
}
static inline psa_key_slot_t *get_volatile_key_slot(psa_key_id_t key_id)
{
MBEDTLS_STATIC_ASSERT(ARRAY_LENGTH(global_data.key_slots) <=
PSA_KEY_ID_VOLATILE_MAX - PSA_KEY_ID_VOLATILE_MIN + 1,
"The key slot array is larger than the volatile key ID range");
return &global_data.key_slots[key_id - PSA_KEY_ID_VOLATILE_MIN];
}
static inline psa_key_slot_t *get_persistent_key_slot(size_t slot_idx)
{
return &global_data.key_slots[slot_idx];
}
static inline psa_key_slot_t *get_key_slot(size_t slice_idx, size_t slot_idx)
{
(void) slice_idx;
return &global_data.key_slots[slot_idx];
}
#endif
int psa_is_valid_key_id(mbedtls_svc_key_id_t key, int vendor_ok)
{ … }
static psa_status_t psa_get_and_lock_key_slot_in_memory(
mbedtls_svc_key_id_t key, psa_key_slot_t **p_slot)
{ … }
psa_status_t psa_initialize_key_slots(void)
{ … }
void psa_wipe_all_key_slots(void)
{ … }
#if defined(MBEDTLS_PSA_KEY_STORE_DYNAMIC)
static psa_status_t psa_allocate_volatile_key_slot(psa_key_id_t *key_id,
psa_key_slot_t **p_slot)
{ … }
psa_status_t psa_free_key_slot(size_t slice_idx,
psa_key_slot_t *slot)
{ … }
#endif
psa_status_t psa_reserve_free_key_slot(psa_key_id_t *volatile_key_id,
psa_key_slot_t **p_slot)
{ … }
#if defined(MBEDTLS_PSA_CRYPTO_STORAGE_C)
static psa_status_t psa_load_persistent_key_into_slot(psa_key_slot_t *slot)
{ … }
#endif
#if defined(MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS)
static psa_status_t psa_load_builtin_key_into_slot(psa_key_slot_t *slot)
{
psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
psa_key_lifetime_t lifetime = PSA_KEY_LIFETIME_VOLATILE;
psa_drv_slot_number_t slot_number = 0;
size_t key_buffer_size = 0;
size_t key_buffer_length = 0;
if (!psa_key_id_is_builtin(
MBEDTLS_SVC_KEY_ID_GET_KEY_ID(slot->attr.id))) {
return PSA_ERROR_DOES_NOT_EXIST;
}
status = mbedtls_psa_platform_get_builtin_key(
slot->attr.id, &lifetime, &slot_number);
if (status != PSA_SUCCESS) {
return status;
}
psa_set_key_id(&attributes, slot->attr.id);
psa_set_key_lifetime(&attributes, lifetime);
status = psa_driver_wrapper_get_builtin_key(
slot_number, &attributes,
NULL, 0, NULL);
if (status != PSA_ERROR_BUFFER_TOO_SMALL) {
if (status == PSA_SUCCESS) {
status = PSA_ERROR_CORRUPTION_DETECTED;
}
return status;
}
status = psa_driver_wrapper_get_key_buffer_size(&attributes,
&key_buffer_size);
if (status != PSA_SUCCESS) {
return status;
}
status = psa_allocate_buffer_to_slot(slot, key_buffer_size);
if (status != PSA_SUCCESS) {
return status;
}
status = psa_driver_wrapper_get_builtin_key(
slot_number, &attributes,
slot->key.data, slot->key.bytes, &key_buffer_length);
if (status != PSA_SUCCESS) {
goto exit;
}
slot->key.bytes = key_buffer_length;
slot->attr = attributes;
exit:
if (status != PSA_SUCCESS) {
psa_remove_key_data_from_memory(slot);
}
return status;
}
#endif
psa_status_t psa_get_and_lock_key_slot(mbedtls_svc_key_id_t key,
psa_key_slot_t **p_slot)
{ … }
psa_status_t psa_unregister_read(psa_key_slot_t *slot)
{ … }
psa_status_t psa_unregister_read_under_mutex(psa_key_slot_t *slot)
{ … }
psa_status_t psa_validate_key_location(psa_key_lifetime_t lifetime,
psa_se_drv_table_entry_t **p_drv)
{ … }
psa_status_t psa_validate_key_persistence(psa_key_lifetime_t lifetime)
{ … }
psa_status_t psa_open_key(mbedtls_svc_key_id_t key, psa_key_handle_t *handle)
{ … }
psa_status_t psa_close_key(psa_key_handle_t handle)
{ … }
psa_status_t psa_purge_key(mbedtls_svc_key_id_t key)
{ … }
void mbedtls_psa_get_stats(mbedtls_psa_stats_t *stats)
{ … }
#endif